ExecutorService:awaitTermination VS while循环

时间:2017-01-09 06:22:23

标签: java multithreading executorservice threadpoolexecutor

我必须等待executorService中所有线程的完成。 我应该使用

while(!executor.isTerminated()){...} or 
executor.awaitTermination(...)?

这些方式的优点和缺点是什么?

2 个答案:

答案 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永远不会为真。