Future.cancel(true)下面发生了什么

假设我有一个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); 。 我所理解的是task.cancel(true)将中断运行此任务的工作线程,如Thread.currentThread().interrupt() 。 但是这只会设置一个标志来告诉工作线程是否被中断。

我的问题是:如果MyTask Runnable已经开始运行, future.cancel(true)实际上是如何在run()停止执行其余代码的代码? 是否有定期检查下方工作线程的中断标志? 我的意思是我不明白如何只通过将interrupt标志设置为true来取消run()中的代码。

Future.cancel不保证您的工作代码将停止执​​行。 它的作用是设置中断标志并导致任何阻塞JDK调用抛出InterruptedException。 您的工作者代码可以选择重新抛出中断的exception并定期检查中断的标志,在这种情况下取​​消机制将起作用。 否则,您可以选择吞下InterruptedException并忽略iterrupted标志,在这种情况下,取消机制除了将cancel标志设置为true之外什么都不做。

请访问http://www.ibm.com/developerworks/library/j-jtp05236/

有一个名为isInterrupted()的方法,它通过返回true / false告诉线程中正在运行的代码它被中断。

这通常通过您可能在线程中调用的wait,sleep等方法进行检查。 但是,如果您不使用这些方法,则必须手动检查此方法[isInterrupted()]以确定是否有人中断了您的线程。

如果你得到一个真的,你可以决定要执行什么动作(比如说:抛出一个InterruptedException或者从循环中断,等等……)