2016-09-09 35 views
5

如果我有下面的代码,它工作正常:Java ExecutorService - 如果awaitTermination()失败会怎么样?

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,该怎么办?

+1

取决于你想要做什么。你可以试着用.shutdown()强制关机,或者用shutdownNow()关机。 – jordaniac89

+1

您好Joschi,您已经按照这篇文章改变了关机逻辑:http://stackoverflow.com/questions/4958330/java- executorservice-awaittermination-of-all-recursively-created-tasks/39295555#39295555 –

+0

嗨,谢谢大家的回答! – Joschi

回答

1

如果awaitTermination()回报false在例如,您可以选择尝试拨打shutdownNow()。此方法将尽最大努力取消所有仍在执行的任务,但它不能保证。一些执行不力的任务可能没有取消政策,只能永远运行。在这种情况下,线程永远不会被终止,并且执行程序永远不会被垃圾收集。

这样的任务也将阻止你的程序正常终止(如果你不把你的工作线程标记为守护进程)。例如,如果你的任务只包含一个空的无限循环,即使你致电shutdownNow(),它也不会被取消。

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

+0

谢谢你的回答和详细的解释! – Joschi

2

如果你想 “逼” 你的ExecutorService终止只需使用:

shutdownNow时()

看看这里的介绍:

enter image description here

+0

谢谢你的回答!我会试一试 – Joschi

相关问题