Waiting for all the threads to finish before shutting down the Executors

…衆ロ難τιáo~ 提交于 2019-11-29 08:11:26
assylias

You generally use the following idiom:

executor.shutdown();
executor.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
  • shutdown just says that the executor won't accept new jobs.
  • awaitTermination waits until all the tasks that have already been submitted finish what they are doing (or until the timeout is reached - which won't happen with Integer.MAX_VALUE - you might want to use a lower value).

shutdown is a "soft" order and won't abruptly shut down the executor. It will do just what you want: refuse any new tasks, wait for all submitted tasks to complete, and then shut down.

Add awaitTermination to your code in order to block until the executor service is shut down.

In the documentation there's also this code that covers all the angles:

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();
   }
 }

What i want to achieve here is that i want to wait for all the threads in the threadpool to have finished the execution and then i want to shutdown the executor.

That is what executor.shutdown(); does. If you want to shutdown immediately you need to use shutdownNow()

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!