如果我有下面的代码,它工作正常: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,该怎么办?
取决于你想要做什么。你可以试着用.shutdown()强制关机,或者用shutdownNow()关机。 – jordaniac89
您好Joschi,您已经按照这篇文章改变了关机逻辑:http://stackoverflow.com/questions/4958330/java- executorservice-awaittermination-of-all-recursively-created-tasks/39295555#39295555 –
嗨,谢谢大家的回答! – Joschi