2016-12-27 6 views
0

Согласно Javadocs, shutdown() будет ждать выполнения всех заданий отправки. У меня есть два вопроса:Необходимость для ExecutorService.awaitTermination() после выключения()

  • Что означает представленная задача? Задачи должны быть отправлены специально методом ExecutorService.submit() или в него включены задачи, представленные методом ExecutorService.execute()?
  • Я добавил крюк отключения, который вызывает ExecutorService.shutdown(). Согласно документам, он должен ждать выполнения всех задач отправки. Но это не происходит, пока я не добавлю вызов awaitTermination() после вызова shutdown(). Почему он не выполняет все задачи без ожидания вызова Termination()?

ответ

1

Что означает представленная задача? Задачи должны быть отправлены специально методом ExecutorService.submit() или в него включены задачи, представленные методом ExecutorService.execute()?

Задача «отправлена» в этом смысле - это любое Runnable или Callable, которое было передано в ExecutorService. Хотя формулировка javadoc немного запутанна, она не различает execute() против submit().

Я добавил крюк отключения, который вызывает ExecutorService.shutdown(). Согласно документам, он должен ждать выполнения всех задач отправки. Но это не происходит, пока я не добавлю вызов awaitTermination() после вызова shutdown(). Почему он не выполняет все задачи без ожидания вызова Termination()?

Операция shutdown() не является блокирующей (асинхронной), как и почти все методы API-интерфейса ExecutorService. В javadoc указано только, что вызов shutdown() будет инициировать последовательность выключения.

Ключевым моментом здесь является то, что ExecutorService будет попробовать ждать все задачи, чтобы закончить, но если shutdown() последняя строка кода, прежде чем ваш основной метод завершается, System.exit() будет называться после окончания основного метода, который прекратит JVM и переопределит попытку ExecutorService дождаться завершения выполняемых задач. Я бы счел это нежелательным для ExecutorService.shutdown(), чтобы всегда задерживать System.exit(), и предпочтет подход выбора в блокирующий вызов (т. Е. awaitTermination).