我未能成功尝试取消使用此代码提交的线程
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/