Завершение работы инициирует упорядоченное завершение работы, при котором выполняются ранее отправленные задачи, но новые задачи приниматься не будут.
executor.shutdown();
System.out.println("All tasks submitted...No new tasks will be admitted");
Тем не менее, я настоятельно рекомендую использовать awaitTermination, так как это позволит блокировать текущий поток до тех пор, пока все задачи не завершат выполнение после запроса на завершение работы, или не истечет время ожидания, или текущий поток не будет прерван, в зависимости от того, что произойдет раньше.
try {
executor.awaitTermination(3, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
РЕДАКТИРОВАТЬ:
The runState provides the main lifecyle control, taking on values:
* RUNNING: Accept new tasks and process queued tasks
* SHUTDOWN: Don't accept new tasks, but process queued tasks
* STOP: Don't accept new tasks, don't process queued tasks,
* and interrupt in-progress tasks
* TIDYING: All tasks have terminated, workerCount is zero,
* the thread transitioning to state TIDYING
* will run the terminated() hook method
* TERMINATED: terminated() has completed
Числовой порядок среди этих значений имеет значение, чтобы можно было проводить упорядоченные сравнения. RunState монотонно увеличивается с течением времени, но не обязательно должно достигаться каждое состояние. Переходы:
РАБОТАЕТ -> ВЫКЛЮЧЕНИЕ
При вызове shutdown(), возможно, неявно в finalize()
(РАБОТАЕТ или ВЫКЛЮЧЕН) -> ОСТАНОВИТЬ
При вызове shutdownNow()
SHUTDOWN -> TIDYING
Когда и очередь, и пул пусты
STOP -> TIDYING
Когда пул пуст
TIDYING -> TERMINATED
После завершения работы метода ловушки terminated(). Потоки, ожидающие в awaitTermination(), будут возвращены, когда состояние достигнет TERMINATED.
Обнаружение перехода из SHUTDOWN в TIDYING не так просто, как хотелось бы, потому что очередь может стать пустой после непустой и наоборот во время состояния SHUTDOWN, но мы можем завершить работу только в том случае, если, увидев, что она пуста, мы видим, что workerCount равно 0.
Возвращаясь к вашему вопросу, когда вы вызываете getPoolSize(), он проверяет состояние пула потоков, когда он находится в состоянии TIDYING. Следовательно, я думаю, что правильная проверка должна быть против состояния TERMINATED. Хотя результаты будут такими же, если вы не реализовали метод terminated().
person
Suparna
schedule
25.03.2016