Java 为什么可以';我不能取消遗嘱执行人提交的工作吗?

Java 为什么可以';我不能取消遗嘱执行人提交的工作吗?,java,multithreading,future,java-threads,executor,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)

我尝试取消使用此代码提交的线程失败

  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();
ExecutorService executor=Executors.newSingleThreadExecutor();
Future-Future=executor.submit(()->{while(true){System.out.println(“线程”);Thread.yield();});
睡眠(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();
ExecutorService executor=Executors.newSingleThreadExecutor();
Future-Future=executor.submit(()->{while(true){System.out.println(“线程”);Thread.sleep(1000);});
睡眠(3000);
future.cancel(true);
executor.shutdown();

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

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

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

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

如果您打算停止您可以使用的所有已提交任务

executor.shutdownNow();
尝试停止所有正在执行的任务,停止处理 等待的任务,并返回等待的任务列表 执行



正如在问题的评论部分中已经提到的,中断调用的
.sleep(1000)
.yield()
行为之间的区别在于是的,您运行的是一个紧循环,Java中的线程基本上是不可终止的,只是可中断的
Thread.yield()
实际上什么都不做。线程应该检查中断位或执行可中断操作。我建议阅读一本关于线程的好教程。我认为合适的方法应该是
Thread.interrupted()
,而不是
Thread.currentThread().isInterrupted()
,它应该用于当前线程以外的线程。有趣的是,这会清除该线程的中断状态,所以我有点不愿意使用它。因为你在线程池中执行任务(你不是线程的所有者,所以你不知道中断对它意味着什么),所以应该保留中断状态。@michalk就我所知,你是对的。我不知道如何使用
shutdownNow()
会比
取消
好-它也会这样做-尝试中断线程。如果线程不可中断,它将继续运行。Future.cancel是中断线程的最简单方法。我不认为在这里使用关机有任何意义。只是一次优雅的关机就足够了。线程已经被中断,因此
sutdownNow
在这里没有用处。