Я доволен идеей упорядоченного отключения потоков, запланированных с ExectuorService
; то есть, вызов shutdown
или shutdownNow
приведет к корректному завершению потоков, созданных в пуле. Если они ответят на interrupt
, вы можете быть уверены, что, наконец, и т. Д. Будет вызван, и вы получите чистый, предсказуемый выход (где вы можете очистить любые ресурсы и т.д.).
Однако, если вы указали в своей нити демон (через ThreadFactory
исполнителя), как показано ниже.
ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable runnable) {
Thread thread = Executors.defaultThreadFactory().newThread(runnable);
thread.setDaemon(true);
return thread;
}
});
после того, как основной поток завершает работу, виртуальная машина прерывает любые потоки демона. В приведенном выше примере запланированный, а затем внезапно завершенный поток (daemon) будет обходить любые блоки finally, а любые прерываемые методы не будут выбрасывать InterruptedException
.
Итак, я склонен считать, что маркировка потоков, используемых в пуле ThreadPoolExecutor
, как дьявола - плохая практика ... мой вопрос на самом деле о том, чтобы помочь мне вокализировать почему .
Почему плохая практика (или нет, если вы не согласны) использовать потоки демона в пуле потоков ExecutorService
? В частности, меня интересует описание жизненного цикла завершения работы виртуальной машины с постепенным завершением работы (потоки, которые имеют политику прерывания и работают хорошо) против потоков демона.
Расширяя эту последнюю точку, finalize
на ThreadPoolExecutor
вызовет shutdown
для себя, но когда он использует потоки демона, они могли бы завершиться уже, если бы виртуальная машина вызвала finalize
. Каково поведение пула потоков тогда? Можно ли обмануть его, чтобы он оставался живым (и, следовательно, не выходил из ВМ), если базовые потоки внезапно завершались?
Частично причина, по которой я спрашиваю, состоит в том, что я видел, как раньше она обходила необходимость выключать фактическую службу ExectorService. Можете ли вы вспомнить сценарии, в которых обход его жизненного цикла выключения может оказать плохое влияние? Пока что единственная причина, по которой я могу придумать использование демонов, - это сократить путь, и я хочу оценить любые неожиданные побочные эффекты, которые это может вызвать.