Почему ShutdownHookThread 'setDaemon true' - PullRequest
4 голосов
/ 14 октября 2011

Недавно мне нужно было добавить хук отключения к имеющемуся у меня приложению Scala, и я обнаружил, что Scala предоставляет помощник для этого, называемый ShutdownHookThread . В его источнике я заметил, что устанавливает новый поток как поток демона .

def apply(body: => Unit): ShutdownHookThread = {
  val t = new ShutdownHookThread(hookName()) {
    override def run() = body
  }
  t setDaemon true  // <--------- right here
  runtime addShutdownHook t
  t
}

Почему это сделано? Мне кажется, что вы, вероятно, захотите противоположного в потоке ловушек завершения работы (т.е. убедитесь, что этот поток завершается, прежде чем завершать работу jvm). Или daemon / not-daemon не относится к перехватчикам завершения работы?

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

В JVM, как правило, поток, не являющийся демоном, будет препятствовать завершению JVM. Если больше нет потоков, не являющихся демонами, JVM будет корректно завершать работу, инициируя завершение работы. См. addShutdownHook javadoc для получения дополнительной информации.

После завершения выключения, я не уверен, что статус демона имеет значение. Также нити крюка отключения не запускаются до тех пор, пока не будет инициировано отключение. Так что в этом случае t setDaemon true может быть ненужным, но это также не повредит.

Короче говоря, семантика "daemon" отличается от unix (где на земле unix он обозначает поток, который продолжает работать).

1 голос
/ 26 октября 2011

Отвечая на мой собственный вопрос здесь.

Две части:

  1. Почему ShutdownHookThread делает свои новые потоки daemon = true?
  2. Если отключение перехватываетthread is daemon = true, что происходит?

Ответы:

  1. Это вытекает из требований для "Scala-сценариев" (запуск scala myfile.scala вместо явной компиляции первым).Обсуждение здесь .Теперь он был изменен ( commit ), поэтому будущие версии ShutdownHookThread не будут иметь этот код.
  2. Я не нашел ничего решающего, но экспериментально это не имеет значения,Я думаю, что это имеет смысл, так как состояние демона влияет на то, когда JVM начнет отключение, поэтому после завершения отключения состояние демона не должно иметь значения.
...