我必须等待executorService中所有线程的完成。 我应该使用
while(!executor.isTerminated()){...} or
executor.awaitTermination(...)?
这些方式的优点和缺点是什么?
答案 0 :(得分:2)
使用executor.isTerminated()
,您当前的线程将继续运行。
使用executor.awaitTermination()
将阻止当前线程。
所以它取决于你想要在当前线程中做什么。
您是否想要执行某些任务并定期检查执行程序是否已完成,然后使用executor.isTerminated()
?
或者当前线程是否正在等待执行程序完成。如果是,executor.awaitTermination()
更有意义。
请注意,只有在调用shutdown()
或shutdownNow()
时才会终止执行者。
答案 1 :(得分:0)
来自oracle文档的推荐方法link:
void shutdownAndAwaitTermination(ExecutorService pool) {
pool.shutdown(); // Disable new tasks from being submitted
try {
// Wait a while for existing tasks to terminate
if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
pool.shutdownNow(); // Cancel currently executing tasks
// Wait a while for tasks to respond to being cancelled
if (!pool.awaitTermination(60, TimeUnit.SECONDS))
System.err.println("Pool did not terminate");
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
pool.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
如果您的线程未在120秒内完成,则可以在条件为:
时更改第二个while(!pool.awaitTermination(60, TimeUnit.SECONDS)) {
Thread.sleep(60000);
}
您可以在@ wait until all threads finish their work in java
找到其他替代方案关于isTerminated
的使用的另一个关键说明:
boolean isTerminated()
如果关闭后所有任务都已完成,则返回true。请注意,除非先调用shutdown或shutdownNow,否则isTerminated永远不会为真。