@ElenaKovalinskaya

По какой причине java.util.concurrent.ExecutorService.awaitTermination() может не дожидаться завершения всех запущенных задач?

У меня возникла проблема при использовании 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.

Буду очень благодарна любой зацепке.
  • Вопрос задан
  • 121 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы