“你好,阿米戈!這是一個有趣的問題,你要么已經遇到過,要么很快就會遇到。如何停止正在運行的線程? ”
假設用戶告訴程序«從互聯網下載文件»。主線程為此作業創建一個單獨的子線程,並向其傳遞一個對象,該對象的運行方法包含下載文件的所有必要操作。
但是用戶突然改變了主意。他不想下載文件。我們如何取消作業並停止線程?
“是的,告訴我怎麼做?”
“我們不能。這是最常見和最正確的答案。你不能停止線程。只有它可以停止自己。 ”
但是您可以向線程發送信號,以某種方式告訴它不再需要執行工作並且它應該終止。正如主線程通過從 main 方法返回而終止一樣,子線程通過從 run 方法返回而終止。
“最好的方法是什麼?”
“您可以添加一些變量,例如布爾值。如果它是true,則線程運行。如果它是false ,則線程應該終止。像這樣,例如:”
代碼 | 描述 |
---|---|
|
Clock 類永遠每秒向控制台寫入一次 «Tick» 如果 ClockManager.isClockRun 為假,運行方法結束。 |
|
主線程啟動一個應該永遠運行的子線程(時鐘)
等待 10 秒,然後 給時鐘一個結束信號。 主線程完成它的工作。 時鐘線程結束它的工作。 |
“如果我們有多個線程怎麼辦?”
“最好為每個線程都有這樣一個變量。直接將它添加到類中是最方便的。您可以在那裡添加一個布爾值 isRun變量。但是,最好添加一個布爾值isCancel變量,如果任務是取消。”
代碼 | 描述 |
---|---|
|
只要isCancel為假,Clock 類就會每秒向控制台寫入一次單詞 «Tick»。
當isCancel變為真時,run 方法終止。 |
|
主線程啟動一個應該永遠運行的子線程(時鐘)
等待 10 秒,然後 通過調用 cancel 方法取消任務。 主線程完成它的工作。 時鐘線程結束它的工作。 |
“我會記住這一點的。謝謝,艾莉。”
GO TO FULL VERSION