假设我有一个 Runnable
实例:
class MyTask implements Runnable {
public void run() {
//some heavy calculation which takes time
Thread.sleep(5000)
//rest code
...
}
}
然后,我使用 ExecutorService 提交上面的任务:
ExecutorService service = Executors.newFixedThreadPool(3);
Future<?> task = service.submit(new MyTask());
现在,我可以通过 task.cancel(true);
取消任务。据我了解,task.cancel(true)
将中断运行此任务的工作线程,如 Thread.currentThread().interrupt()
。但是这只是设置了一个标志来告诉工作线程被中断了。
我的问题是:如果 MyTask
Runnable 已经开始运行,那么 future.cancel(true)
实际上是如何在 run()
中停止我的代码的> 继续执行其余代码?是否定期检查工作线程的中断标志?我的意思是我不明白 run() 中的代码如何通过仅将中断标志设置为 true 来取消。
最佳答案
Future.cancel 不保证您的工作代码将停止执行。它所做的是设置中断标志并导致任何阻塞的 JDK 调用抛出 InterruptedException。您的工作代码可能会选择重新抛出中断的异常并定期检查中断标志,在这种情况下取消机制将起作用。否则,您可以选择吞下 InterruptedException 并忽略 iterrupted 标志,在这种情况下,取消机制只会将取消标志设置为 true。
关于java - Future.cancel(true) 下面发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26516372/