Why does ShutdownHookThread 'setDaemon true'
I recently needed to add a shutdown hook to a Scala app I have, and I discovered that Scala provides a helper for this called ShutdownHookThread. In its source I noticed that it sets the new thread to be a daemon thread.
def apply(body: => Unit): ShutdownHookThread = {
val t = new ShutdownHookThread(hookName()) {
override def run() = body
}
t setDaemon true // <--------- right here
runtime addShutdownHook t
t
}
Why is this done? It seems to me you'd probably want the opposite in开发者_运维百科 a shutdown hook thread (i.e. make sure that thread exits before shutting down the jvm). Or is daemon/not-daemon not relevant for shutdown hooks?
On the JVM, in general a non-daemon thread will prevent the JVM from terminating. Once there are no longer any non-daemon threads, then the JVM will gracefully terminate by initiating shutdown. See the addShutdownHook javadoc for more info.
Once shutdown has been initiated, I'm not sure daemon status matters. Also shutdown hook threads aren't started until the shutdown has been initiated. So in this case t setDaemon true may be unnecessary, but it won't hurt either.
So in short the "daemon" semantic differs from unix (where in unix land it denotes a thread that keeps running).
Answering my own question here.
Two parts:
- Why does
ShutdownHookThreadmake its new threads daemon=true? - If a shutdown hook thread is daemon=true, what happens?
Answers:
- This stemmed from requirements for "Scala scripting" (running
scala myfile.scalarather than explicitly compiling first). Discussion here. It has now been changed (commit), so future versions ofShutdownHookThreadwon't have this code. - I haven't found anything decisive, but experimentally it seems not to matter. I think this makes sense since daemon status affects when the JVM will commence shutdown, so after shutdown's already underway, daemon status shouldn't matter.
加载中,请稍侯......
精彩评论