聊聊addShutdownHook关闭钩子

云栖号资讯小哥 2020-08-05

jvm 线程 操作系统 aliyun thread

云栖号资讯:【点击查看更多行业资讯
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


addShutdownHook是什么呢

这是一个jvm中的关闭钩子。当程序退出时,会执行添加的shutdownHook线程。其中shutdownHook是一个已初始化但并没有启动的线程,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以,可通过这些钩子在jvm关闭的时候进行内存清理、资源回收等工作。

程序退出的原因及是否触发关闭钩子

  • 所有的线程已经执行完毕(√)
  • 调用System.exit()(√)
  • 用户输入Ctrl+C(√)
  • 遇到问题异常退出(√)
  • kill -9 杀掉进程(×)

注意: 杀进程,或者在idea里面直接stop服务是不会触发该钩子线程的

实现

RunTime.getRunTime().addShutdownHook(new Thread(() -> { 
 // do something before shutdown
}))
  • 何时增加关闭钩子:任何时候!!!在任何情况下都可以增加一个关闭钩子,只要在JVM关闭之前。如果试图在JVM开始关闭后注册一个关闭钩子,将抛出一个带有”Shutdown is progress”消息的IllegalStateException。
  • 增加相同的钩子:不能增加相同的钩子。如果这样做了,将抛出带有”Hook previously registered”消息的IllegalArgumentException。
  • 注销钩子:调用Runtime.removeShutdownShook(Thread hook)可以注销一个钩子。
  • 注意并发:万一不止一个关闭钩子,它们将并行地运行,并容易引发线程问题,例如死锁
  • 关闭钩子的可靠性:JVM将在退出的时候尽最大努力来执行关闭钩子,但是不保证一定会执行。例如,当在Linux中使用-kill命令时,或在Windows中终结进程时,由于本地代码被调用,JVM将立即退出或崩溃。
  • 注意钩子的时间消耗:需要注意的重点之一是,关闭钩子不应该花费过多时间。考虑这样一个场景,当用户从操作系统中注销,操作系统花费非常有限的时间就正常退出了,因此在这样样的场景下JVM也应该尽快退出。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-08-04
本文作者:冰糖葫芦有点酸
本文来自:“掘金”,了解相关信息可以关注“掘金”

登录 后评论
下一篇
云栖号资讯小编
12038人浏览
2020-07-13
相关推荐
Java多线程知识小抄集(三)
779人浏览
2016-05-10 15:30:00
并发编程7 - 任务取消
895人浏览
2015-02-09 11:38:00
Flume-ng启动过程分析
955人浏览
2014-03-26 17:28:00
Runtime.addShutdownHook添加钩子
1150人浏览
2016-09-26 18:08:00
【Kafka源码】Kafka启动过程
1310人浏览
2017-10-23 17:24:16
取消与关闭(第七章)
1263人浏览
2017-11-04 18:03:02
从JDK源码看关闭钩子
1049人浏览
2017-10-23 09:54:23
JAVA 虚拟机钩子
575人浏览
2016-12-31 08:55:00
Tomcat 优雅关闭之路
467人浏览
2020-02-13 14:32:32
0
0
0
389