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

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

最佳答案

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

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

关于java - Future.cancel(true) 下面发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26516372/

相关文章:

java - java中 Activity 线程数中的后台线程是多少?

java - 在 Thymeleaf 中,如何获取 HTML 变量并将其发送到 Controller ?

Javaslang - 如何加入两个成功的尝试?

c++ - 如何在多个处理器上运行 boost::threads?

c# - 当时间为 XX 时显示气球提示 :XX in C#

Android - 启动线程会导致应用程序崩溃

java - Java Future 重复超时导致 JVM 内存不足

java - 在 Java 中将 InputStream 转换为 FileItem

java - 如何使用Javamail发送简单的Email?

java - 将 Future 与 ExecutorService 结合使用