Подтвердить что ты не робот

ExecutorService ждут. Закрепление застревает

Я создал пул потоков с фиксированным размером с Executors.newFixedThreadPool(2), и я выполнил 10 Runnable объектов. Я устанавливал контрольные точки и отслеживал их выполнение. Однако fixedSizeThreadPool.awaitTermination() не позволяет мне продолжать, даже если все задачи выполняются.

В принципе:

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);
for (int i = 0; i < 10; ++i) {
    fixedSizeThreadPool.execute(myRunables[i]);
}
try {
    fixedSizeThreadPool.awaitTermination(timeout, timeoutUnits);
} catch (Exception e) { }
System.out.println("done!");

Но это всегда застревает на awaitTermination. Что не так?

4b9b3361

Ответ 1

Как отметил Питер, shutdown() должен быть вызван первым.

источник: javadoc

Ответ 2

Вы также можете использовать ExecutorService # invokeAll. Он блокируется до тех пор, пока не будут выполнены все задачи или не будет достигнут тайм-аут. Это немного чище, чем использование shutdown, если ваш ExecutorService содержит другие задачи, а также специально запланированные задачи. На них также повлияет вызов shutdown.