“你好,阿米戈!这是一个有趣的问题,你可能已经遇到或很快就会遇到。如何停止正在运行的线程?

假设用户告诉程序“从互联网下载文件。主线程为此作业创建一个单独的子线程,并向其传递一个对象,该对象的 run 方法包含下载文件所需的全部必要操作。

但是用户突然改变了主意。他不想下载文件了。我们如何取消作业并停止线程呢?

“是啊,告诉我如何做?”

我们做不到。这是最常见、最正确的答案。你无法停止线程。线程只能自行停止。

但是你可以向线程发送信号,通过某种方式告诉它不再需要执行工作并应终止运行。就像主线程通过从 main 方法返回进行终止一样,子线程也通过从 run 方法返回进行终止。

“这样做的最佳方法是什么?”

“你可以添加某个变量,如 boolean。如果它为 true,则线程运行。如果为 false,则线程应终止。如以下示例所示:”

代码 说明
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

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

Clock 类始终每隔一秒向控制台写入一次“嘀嘀”

如果 ClockManager.isClockRun 为 false,则 run 方法结束。

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;
}

}
主线程启动应永远运行的子线程 (clock)

等待 10 秒,并向 clock 发送信号以结束运行。

主线程完成工作。

clock 线程结束工作。

“如果我们有多个线程会怎么样,又该怎么做呢?”

“最好在每个线程中都有这样一个变量。最方便的办法是将其直接添加到类中。可以添加 boolean isRun 变量。但是,最好添加一个 boolean isCancel 变量,如果取消任务,该变量将变为 true。”

代码 说明
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 为 false,Clock 类会每隔一秒向控制台写入一次词语“嘀嘀”。

isCancel 变为 true 时,run 方法将终止。

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

Thread.sleep(10000);
clock.cancel();
}
主线程启动应永远运行的子线程 (clock)

等待 10 秒,然后通过调用 cancel 方法取消任务。

主线程完成工作。

clock 线程结束工作。

“我会记住这一点。谢谢你,艾莉。”