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

时间:2014-10-22 20:19:14

标签: java multithreading executorservice java.util.concurrent

假设我有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()继续执行其余代码的过程中是如何停止我的代码的?是否定期检查下方工作线程的中断标志?我的意思是我不明白如何通过将中断标志设置为true来取消run()中的代码。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

请参阅http://www.ibm.com/developerworks/library/j-jtp05236/