Java ExecutorService: awaitTermination всех рекурсивно созданных задач - PullRequest
32 голосов
/ 10 февраля 2011

Я использую ExecutorService для выполнения задачи. Эта задача может рекурсивно создавать другие задачи, отправленные на тот же ExecutorService, и эти дочерние задачи тоже могут это делать.

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

Я не могу вызвать ExecutorService.shutdown() в главном потоке, потому что это препятствует принятию новых задач ExecutorService.

И Вызов ExecutorService.awaitTermination(), кажется, ничего не делает, если shutdown не был вызван.

Так что я как бы застрял здесь. 1015 * не может быть так сложно увидеть, что все рабочие бездействуют, не так ли? Единственное неуместное решение, которое я мог придумать, - это напрямую использовать ThreadPoolExecutor и периодически запрашивать его getPoolSize(). Неужели нет лучшего способа сделать это?

Ответы [ 11 ]

0 голосов
/ 10 февраля 2011

Использовать CountDownLatch . Передайте объект CountDownLatch каждой из ваших задач и закодируйте свои задачи, как показано ниже.

public void doTask() {
    // do your task
    latch.countDown(); 
}

Принимая во внимание, что поток, который должен ждать, должен выполнить следующий код:

public void doWait() {
    latch.await();
}

Но, конечно, это предполагает, что вы уже знаете количество дочерних задач, чтобы вы могли инициализировать счетчик защелки.

...