“你好,阿米戈!這是一個有趣的問題,你要么已經遇到過,要么很快就會遇到。如何停止正在運行的線程?

假設用戶告訴程序«從互聯網下載文件»。主線程為此作業創建一個單獨的子線程,並向其傳遞一個對象,該對象的運行方法包含下載文件的所有必要操作。

但是用戶突然改變了主意。他不想下載文件。我們如何取消作業並停止線程?

“是的,告訴我怎麼做?”

我們不能。這是最常見和最正確的答案。你不能停止線程。只有它可以停止自己。

但是您可以向線程發送信號,以某種方式告訴它不再需要執行工作並且它應該終止。正如主線程通過從 main 方法返回而終止一樣,子線程通過從 run 方法返回而終止。

“最好的方法是什麼?”

“您可以添加一些變量,例如布爾值。如果它是true,則線程運行。如果它是false  ,則線程應該終止。像這樣,例如:”

代碼 描述
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

Clock 類永遠每秒向控制台寫入一次 «Tick»

如果 ClockManager.isClockRun 為假,運行方法結束。

class ClockManager
{
public static boolean isClockRun = true;
public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
isClockRun = false;
}

}
主線程啟動一個應該永遠運行的子線程(時鐘)

等待 10 秒,然後 給時鐘一個結束信號。

主線程完成它的工作。

時鐘線程結束它的工作。

“如果我們有多個線程怎麼辦?”

“最好為每個線程都有這樣一個變量。直接將它添加到類中是最方便的。您可以在那裡添加一個布爾值 isRun變量。但是,最好添加一個布爾值isCancel變量,如果任務取消。”

代碼 描述
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
只要isCancel為假,Clock 類就會每秒向控制台寫入一次單詞 «Tick»。

isCancel變為真時,run 方法終止。

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}
主線程啟動一個應該永遠運行的子線程(時鐘)

等待 10 秒,然後 通過調用 cancel 方法取消任務。

主線程完成它的工作。

時鐘線程結束它的工作。

“我會記住這一點的。謝謝,艾莉。”