gpt4 book ai didi

Java ExecutorService - 如果 awaitTermination() 失败怎么办?

转载 作者:搜寻专家 更新时间:2023-10-31 20:09:23 24 4
gpt4 key购买 nike

如果我有以下代码,它工作正常:

ExecutorService service = Executors.newFixedThreadPool(100);

[....]

List<Future<SomeObject>> futures = service.invokeAll(callables);
for (Future f : futures) {
f.get();
}

// shutdown the service after all Callables are finished.
service.shutdown();

boolean serviceIsShutDown = service.awaitTermination(5, TimeUnit.SECONDS);
if (serviceIsShutDown) {
System.out.println("Service terminated normally. All ok.");
} else {
// What if it's not shutDown?
[...]
// this?
//service = null;
}

问题:如果调用怎么办

boolean serviceIsShutDown = service.awaitTermination(5, TimeUnit.SECONDS);

因为超时而返回 false?

我猜 ExecutorService 中的线程将保持在 WAIT 状态。继续的最佳解决方案是什么?将服务设置为 null 并让 GarbageCollector 删除它?但是相关的线程会发生什么?它会因为仍然有引用而被垃圾收集吗?

该代码通常有效,但只是好奇。返回false怎么办?

最佳答案

如果 awaitTermination() 在您的示例中返回 false,您可以选择尝试调用 shutdownNow()。此方法将尽最大努力取消所有仍在执行的任务,但它不提供任何保证。一些实现不佳的任务可能没有取消政策,只能永远运行。在这种情况下,线程永远不会终止,执行程序也永远不会被垃圾回收。

此类任务还会阻止您的程序正常终止(如果您不将工作线程标记为守护进程)。

例如,如果您的任务只包含一个空的无限循环,即使您调用 shutdownNow() 也不会被取消。

还有一种情况是任务没有适当的取消策略,并且运行时间过长(但不是永远)。例如,它有一个非常非常长的空循环。您可能无法通过 shutdown()/shutdownNow() 关闭正在执行此类任务的池,但迟早它会完成其工作和线程将与执行者一起终止。

关于Java ExecutorService - 如果 awaitTermination() 失败怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39414171/

24 4 0
文章推荐: java - 是否可以在 Dagger 2 中限定构造函数注入(inject)的范围?
文章推荐: java - Class.forName 等效于从 String 创建 ParameterizedType
文章推荐: java - 为什么 UnaryFunction 可以转换为 UnaryFunction