加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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返回的线程
?(并且无论如何都会导致“IllegalArgumentException:Hook以前注册过”).

此外,调用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"))

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读