Демонические потоки, запланированные на ExecutorService; объясните, почему это дурной тон

Мне нравится идея упорядоченного завершения работы потоков, запланированных с помощью ExectuorService ; то есть вызов shutdown или shutdownNow заставит потоки, созданные в пуле, корректно завершиться. Если они ответят на прерывание , вы можете быть уверены, что в конце концов будут вызваны и т.д., и вы получите чистый, предсказуемый выход (где вы можете очистить любые ресурсы и т.д.).

Однако, если вы установили ваш поток должен быть демоном (через ThreadFactory исполнителя), как показано ниже.

ExecutorService pool = Executors.newSingleThreadExecutor(new ThreadFactory() {
   @Override
   public Thread newThread(Runnable runnable) {
      Thread thread = Executors.defaultThreadFactory().newThread(runnable);
      thread.setDaemon(true);
      return thread;
   }
});

после завершения основного потока, виртуальная машина внезапно завершит все потоки демона. В приведенном выше примере поток (демон), запланированный, а затем внезапно завершенный, будет обходить все блоки finally, и любые прерываемые методы не будут генерировать InterruptedException .

Итак, я склонен думать, что маркировка потоки, используемые в пуле ThreadPoolExecutor в качестве демона, - плохая практика ... мой вопрос действительно о том, чтобы помочь мне озвучить , почему .

Почему это плохая практика (или нет) если вы не согласны) использовать потоки демона в пуле потоков ExecutorService ? В частности, меня интересует описание жизненного цикла завершения работы виртуальной машины с постепенным завершением работы (потоки, которые имеют политику прерывания и хорошо играют) по сравнению с потоками демонов.

Расширяя этот последний пункт, завершите на ThreadPoolExecutor вызовет shutdown на себе, но когда он использует потоки демона, они могли уже завершиться, если finalize был вызван виртуальной машиной. Каково же тогда поведение пула потоков? Можно ли обманом заставить его остаться в живых (и, таким образом, не выйти из виртуальной машины), если базовые потоки внезапно завершились?

Частично я спрашиваю, потому что я видел, что он использовался для обхода необходимости выключения фактического ExectorService. Можете ли вы представить себе сценарии, в которых обход его жизненного цикла завершения может иметь неприятные последствия? Пока что единственная причина, по которой я могу придумать использование демонов, - это сократить путь, и я хочу оценить любые неожиданные побочные эффекты, которые это может вызвать.

20
задан Craig P. Motlin 10 October 2011 в 15:09
поделиться