“你好,阿米戈!这是一个有趣的问题,你可能已经遇到或很快就会遇到。如何停止正在运行的线程?”
假设用户告诉程序“从互联网下载文件。主线程为此作业创建一个单独的子线程,并向其传递一个对象,该对象的 run 方法包含下载文件所需的全部必要操作。
但是用户突然改变了主意。他不想下载文件了。我们如何取消作业并停止线程呢?
“是啊,告诉我如何做?”
“我们做不到。这是最常见、最正确的答案。你无法停止线程。线程只能自行停止。”
但是你可以向线程发送信号,通过某种方式告诉它不再需要执行工作并应终止运行。就像主线程通过从 main 方法返回进行终止一样,子线程也通过从 run 方法返回进行终止。
“这样做的最佳方法是什么?”
“你可以添加某个变量,如 boolean。如果它为 true,则线程运行。如果为 false,则线程应终止。如以下示例所示:”
代码 | 说明 |
---|---|
|
Clock 类始终每隔一秒向控制台写入一次“嘀嘀” 如果 ClockManager.isClockRun 为 false,则 run 方法结束。 |
|
主线程启动应永远运行的子线程 (clock)
等待 10 秒,并向 clock 发送信号以结束运行。 主线程完成工作。 clock 线程结束工作。 |
“如果我们有多个线程会怎么样,又该怎么做呢?”
“最好在每个线程中都有这样一个变量。最方便的办法是将其直接添加到类中。可以添加 boolean isRun 变量。但是,最好添加一个 boolean isCancel 变量,如果取消任务,该变量将变为 true。”
代码 | 说明 |
---|---|
|
只要 isCancel 为 false,Clock 类会每隔一秒向控制台写入一次词语“嘀嘀”。
当 isCancel 变为 true 时,run 方法将终止。 |
|
主线程启动应永远运行的子线程 (clock)
等待 10 秒,然后通过调用 cancel 方法取消任务。 主线程完成工作。 clock 线程结束工作。 |
“我会记住这一点。谢谢你,艾莉。”
GO TO FULL VERSION