java - 为什么我无法取消执行者提交的作业?

标签 java multithreading future java-threads executor

我未能成功尝试取消使用此代码提交的线程

  ExecutorService executor = Executors.newSingleThreadExecutor();
  Future<Object> future = executor.submit(()-> {while(true) { System.out.println("Thread"); Thread.yield();} } );
  Thread.sleep(3000);
  future.cancel(true);
  executor.shutdown();

但线程仍保持运行。 当使用 sleep 而不是yield 时,线程确实会被取消。例如,这确实取消了线程:

  ExecutorService executor = Executors.newSingleThreadExecutor();
  Future<Object> future = executor.submit(()-> {while(true) { System.out.println("Thread"); Thread.sleep(1000);} } );
  Thread.sleep(3000);
  future.cancel(true);
  executor.shutdown();

发生什么事了?我在文档中遗漏了什么吗?

最佳答案

您的第一个任务不会响应中断。但第二个任务是响应式的,因为 Thread.sleep 是一种对中断响应的阻塞方法。解决该问题的一种方法是让您的任务对中断做出响应。这是它的样子。

Future<?> future = executor.submit(() -> {
    while (!Thread.currentThread().isInterrupted())
        System.out.println("Thread");
});

此外,Thread.yield 只是一个调度程序提示,用于生成当前对处理器的使用情况。此操作与平台相关,不应在实践中使用。因此我已将其从我的答案中删除。

关于java - 为什么我无法取消执行者提交的作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58079275/

相关文章:

scala - 组合 future - 如何获得与 future 列表结果相关联的另一个变量

java - 不适用于 recyclerView 中 View 的点击

java - 多维Java ArrayList(声明元素语法)

c++ - 这段代码是线程安全的吗?

使用 Netty 的 Java 客户端点对多点

python - 如何使用线程在文本文件中每行发布请求

scala - 如何在不阻塞的情况下使用 Akka 询问模式

java - 抽象类中的私有(private)引用

java - 一个参数的方法,其数据类型为 Passenger 的 ArrayList

list - 按顺序调用任意数量的 WS.url().get()