Scala关机挂钩永远不会运行?
发布时间:2020-12-16 18:25:02 所属栏目:安全 来源:网络整理
导读:sys.addShutdownHook的 scaladoc表示不保证运行shutdown hooks.现在这是完全合理的,因为如果你向JVM发送一个SIGKILL,或者等同于 Windows的JVM,JVM很难运行关闭挂钩. 但是,使用sys.addShutdownHook添加的关闭挂钩似乎永远不会运行,尽管那些使用Runtime.getRun
sys.addShutdownHook的
scaladoc表示不保证运行shutdown hooks.现在这是完全合理的,因为如果你向JVM发送一个SIGKILL,或者等同于
Windows的JVM,JVM很难运行关闭挂钩.
但是,使用sys.addShutdownHook添加的关闭挂钩似乎永远不会运行,尽管那些使用Runtime.getRuntime.addShutdownHook运行. 一个测试 – 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,main] scala> sys.addShutdownHook(t.run _) res0: scala.sys.ShutdownHookThread = Thread[shutdownHook1,main] scala> george@george-MacBook:~$ 文档说“挂钩是自动注册的:返回的值可以忽略”所以我们不应该添加sys.addShutdownHook返回的线程 此外,调用addShutdownHook返回的线程上运行似乎没有做任何事情,这是可疑的. 解决方法
addShutdownHook的类型签名是(
source):
def addShutdownHook(body: => Unit): ShutdownHookThread 因此,很明显为什么你的代码不起作用.预期是按名称调用参数=>单位,你传递t.run _,返回()=>单位 – 这是完全不同的东西. 调用名称参数在执行之前不会运行,将t.run _传递给它意味着在调用call-by-name参数时创建函数 – 您没有传递函数本身而不是call-by-name参数. 使用 sys.addShutdownHook(t.run) 代替.或者根本不使用线程,只传递应该执行的代码: sys.addShutdownHook(println("hi")) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |