gpt4 book ai didi

Java executorService.shutdownNow() 不取消或中断线程

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:14:45 26 4
gpt4 key购买 nike

此代码在 future.get() 上永久阻塞。我本以为会出现 CancellationExceptionInterruptedException。谁能解释一下?

ExecutorService es = Executors.newSingleThreadExecutor();

es.execute(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {/*squelch*/}
});

Future<Integer> future = es.submit(() -> 1);
es.shutdownNow();
try {
future.get();
} catch (ExecutionException e) {e.printStackTrace();}

docs说没有保证,但我仍然发现观察到的行为很奇怪,因为它暗示停止失败是由行为不当的线程引起的。在这种情况下,似乎没有任何停止线程的尝试。

There are no guarantees beyond best-effort attempts to stop processing actively executing tasks. For example, typical implementations will cancel via Thread.interrupt(), so any task that fails to respond to interrupts may never terminate.

最佳答案

In this case there doesn't seem to be any attempt to stop the thread.

它试图停止运行 Runnables。在这种情况下,那可能就是那个正在 sleep 的人。它将被中断,您将捕获异常并返回。 nop Runnable 仍在队列中。

除非调用 future.get() 的线程被中断,否则您不会得到 InterruptedException

CancellationException 是合理的预期,除了技术上,您没有取消 Future,您关闭了执行器。

预期 用途似乎是零售 Runnables shutdownNow() 返回列表,以便您可以运行它们。这行得通,但你不能根据你提交的内容检查它们,因为它们实际上已经被装饰过(但你不知道这一点,它不返回你提交的引用文献有点令人惊讶)。

获得此功能有两种不好的解决方法:跟踪您返回的 future 并自行取消它们或将 shutdownNow() 返回的 Runnables 转换为 Futures 和取消它们,但这只有效,因为它恰好是您正在使用的执行程序的内部实现。

所以是的,这就是行为,技术上是正确的,但有点奇怪。你想在这里完成什么?

关于Java executorService.shutdownNow() 不取消或中断线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37716346/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com