Ожидание завершения всех потоков перед тем, как завершить работу Исполнителей.

java wait executorservice

15453 просмотра

3 ответа

Вот мой фрагмент кода.

ExecutorService executor = Executors.newFixedThreadPool(ThreadPoolSize);
while(conditionTrue)
{
ClassImplementingRunnable c = new ClassImplementingRunnable();
executor.submit(c);
}

Теперь, после этого сделать

executor.shutdown();

Здесь я хочу добиться того, чтобы я дождался, пока все потоки в пуле потоков завершат выполнение, а затем я хочу завершить работу исполнителя.

Но я думаю, что это не то, что здесь происходит. Кажется, что главный поток выполняет завершение работы, и он просто выключает все.

Раньше, когда мой размер пула потоков был 2, я делал следующее, и это, казалось, работало.

ClassImplementingRunnable c1 = new ClassImplementingRunnable();
executor.submit(c1);
ClassImplementingRunnable c2 = new ClassImplementingRunnable();
executor.submit(c2);
Future f1 = executor.submit(c1);
Future f2 = executor.submit(c2);
while(!f1.done || !f2.done)
{}
executor.submit();

Как мне сделать это для большего количества потоков в пуле потоков? Благодарю.

Автор: Kraken Источник Размещён: 12.11.2019 09:51

Ответы (3)


14 плюса

Решение

Вы обычно используете следующую идиому:

executor.shutdown();
executor.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
  • shutdown просто говорит, что исполнитель не будет принимать новые вакансии.
  • awaitTermination ожидает, пока все уже отправленные задачи завершат свою работу (или пока не истечет время ожидания - что не произойдет с Integer.MAX_VALUE - возможно, вы захотите использовать более низкое значение).
Автор: assylias Размещён: 30.08.2012 09:12

7 плюса

shutdownэто «мягкий» порядок, и он не будет внезапно завершать работу исполнителя. Он будет делать то, что вы хотите: отказаться от любых новых задач, дождаться завершения всех отправленных задач, а затем завершить работу.

Добавьте awaitTerminationк своему коду, чтобы заблокировать, пока служба исполнителя не будет закрыта.

В документации также есть этот код, который охватывает все углы:

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();
   }
 }
Автор: Marko Topolnik Размещён: 30.08.2012 09:12

0 плюса

Здесь я хочу добиться того, чтобы я дождался, пока все потоки в пуле потоков завершат выполнение, а затем я хочу завершить работу исполнителя.

Вот что executor.shutdown();делает. Если вы хотите немедленно завершить работу, вам нужно использоватьshutdownNow()

Автор: Peter Lawrey Размещён: 30.08.2012 09:12
Вопросы из категории :
32x32