Зачем использовать exec.isTermination () перед exec.shutdown () с ExecutorService в Java? - PullRequest
0 голосов
/ 07 ноября 2019

Я изучал потоки и наткнулся на следующий код, и у меня есть некоторые проблемы

ExecutorService exec = Executors.newFixedThreadPool(2);

exec.execute(left);
exec.executed(right);

if (!exec.isTerminated()) {
    exec.shutdown();
    exec.awaitTermination(5L, TimeUnit.SECONDS);
}

int result = left.getResult() + right.getResult();

Если все задачи завершены, тогда, если условие будет ложным, и пул потоков не будет завершен, так как нет команды выключенияза пределами условия if.

Итак, верно ли следующее:

  1. Так не должно ли происходить отключение снаружи, если также?

  2. Почему даже при условии if shutdown () ожидает завершения всех предварительно отправленных задач, и мы даже можем избавиться от awaitTermination ()?

1 Ответ

1 голос
/ 07 ноября 2019

Нет причин звонить isTerminated(). Из документации :

Обратите внимание, что isTerminated никогда не бывает true, если только shutdown или shutdownNow не было вызвано первым.

* 1013Из этого следует, что exec.isTerminated() всегда ложно в этом коде. Оператор if не имеет смысла, поскольку его тело всегда будет выполняться.

Метод shutdown() ничего не ждет:

Инициирует упорядоченное выполнениезавершение работы, при котором выполняются ранее отправленные задачи, но новые задачи не принимаются.

Поэтому вызов awaitTermination все еще полезен. (Но если предположить, что пяти секунд достаточно, это небезопасно; есть лучшие способы убедиться, что все представленные задачи выполнены.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...