У меня возникла проблема при использовании java.util.concurrent.ExecutorService.awaitTermination(). Код, который следует после awaitTermination(), не исполняется, и я не понимаю, почему это происходит.
ExecutorService pool = Executors.newFixedThreadPool(6);
for (HierarchyItem rootItem : rootObjectItems) {
pool.submit(() -> {
final Thread currentThread = Thread.currentThread();
currentThread.setName("Processing " + rootItem.getName());
try {
addressObjectProcessor.handle(rootItem);
} catch (IOException e) {
e.printStackTrace();
}
});
}
pool.shutdown();
try {
boolean poolTermination = pool.awaitTermination(5, TimeUnit.HOURS);
System.out.println(poolTermination);
if (! poolTermination) {
pool.shutdownNow();
if (!pool.awaitTermination(5, TimeUnit.MINUTES))
System.err.println("Executor service did not terminate. " + Instant.now());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
/// код после pool.awaitTermination. Он уже не исполняется
. . . .
По логам я вижу, что все задачи абсолютно точно завершаются (внутри
addressObjectProcessor.handle
метода в самом конце в логи пишется результат исполнения задачи), но код после
awaitTermination
не исполняется. Такая проблема возникает при количестве задач (размер
rootObjectItems
) = 90. Когда их 5-10-15-20, механизм отрабатывает хорошо. Все выглядит так, как будто основной поток засыпает или умирает уже до того момента, когда все задачи завершаются, и даже после таймаута ничего не происходит. Время обработки каждой задачи - от 3 до 60 минут, но в целом время обработки всех 90 задач в 6 потоках занимает не более 4 часов.
Результат исполнения awaitTermination в логи не выводится, и InterruptedException исключение не выбрасывается. Строка
System.out.println(poolTermination);
уже не исполняется.
Сервис, в котором используется этот механизм, запущен в wildfly 16.
Буду очень благодарна любой зацепке.