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

Jos*_*chi 5 java multithreading

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

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;
}   
Run Code Online (Sandbox Code Playgroud)

问题:如果通话怎么办?

boolean serviceIsShutDown = service.awaitTermination(5, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

因超时命中而返回false?

我猜ExecutorService中的Threads将保持WAIT状态.什么是最好的解决方案?将服务设置为null并让GarbageCollector删除它?但相关的线程会发生什么?它是否会被垃圾收集,因为仍然有参考?

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

And*_*gin 2

如果在您的示例中awaitTermination()返回false,您可以选择尝试调用shutdownNow(). 此方法将尽力取消所有仍在执行的任务,但它不保证任何结果。一些执行不力的任务可能没有取消策略并且永远运行。在这种情况下,线程永远不会终止,执行器也永远不会被垃圾收集。

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

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

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