斯卡拉多克sys.addShutdownHook
说shutdown hooks are NOT guaranteed to be run
.现在这是完全合理的,因为如果你向JVM发送一个SIGKILL,或者等同于Windows的JVM,JVM很难运行关闭挂钩.
但是添加的关闭钩子sys.addShutdownHook
似乎永远不会运行,尽管那些与Runtime.getRuntime.addShutdownHook
do一起运行.
一个测试 -
scala> val t = new Thread { override def run = println("hi!") } t: java.lang.Thread = Thread[Thread-4,5,main] scala> Runtime.getRuntime.addShutdownHook(t) scala> hi! george@george-MacBook:~$ scala
(跳过启动消息)
scala> val t = new Thread { override def run = println("hi!") } t: java.lang.Thread = Thread[Thread-4,5,main] scala> sys.addShutdownHook(t.run _) res0: scala.sys.ShutdownHookThread = Thread[shutdownHook1,5,main] scala> george@george-MacBook:~$
文档说"挂钩是自动注册的:返回的值可以被忽略",所以我们不应该添加返回的线程sys.addShutdownHook
(并且无论如何都会导致抛出"IllegalArgumentException:Hook之前注册的").
此外,调用addShutdownHook返回的线程上运行似乎没有做任何事情,这是可疑的.