Мне нравится идея упорядоченного выключения на потоках, запланированных с помощью 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
? В частности, я заинтересован в описании жизненного цикла выключения VM с изящным отключением (потоки, которые имеют политику прерывания и хорошо играют) против потоков демонов.
Развернув эту последнюю точку, finalize
на ThreadPoolExecutor
вызовет shutdown
сам по себе, но когда он будет использовать потоки демона, они могли бы прекратить свое существование, если виртуальная машина вызвала finalize
. Каково поведение пула потоков? Может ли он быть обманутым в оставшемся живым (и, следовательно, не выходящим из ВМ), если основные потоки прекратились внезапно?
Часть причины, о которой я прошу, заключается в том, что я видел, что она использовалась для обхода необходимости закрытия существующего ExectorService. Можете ли вы придумать сценарии, в которых обход его жизненного цикла останова может сильно повлиять? Пока единственная причина, по которой я могу придумать использование демонов, - это короткое сокращение, и я хочу оценить любые неожиданные побочные эффекты, которые это может вызвать.