我们可以通过调用如下方法设置在JVM准备退出时,运行的操作
java.lang.Runtime.addShutdownHook(Thread t)
在hook中的start方法执行结束之前,主线程和其他子线程仍然可以继续执行自己当前的任务,所以某种意义上讲,该方法提供了服务器 gracefully shutdown 的机会,比如轮询某个进程的状态标记。
测试如下代码可以发现:
1. System.exit() 能够触发Hook
2. Ctrl+C 或者 IDE中的Stop按钮 可以触发Hook
3. kill pid 可以触发Hook
4. kill -9 pid 不会触发Hook
5. Runtime.getRuntime().halt() 不会触发Hook
public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { System.out.println("========working on shutdown signal received========"); try { System.out.println("sleeping 2 seconds"); Thread.sleep(2000); System.out.println("========really shutdown========"); } catch (InterruptedException e) { e.printStackTrace(); } } })); int i = 0; while (true) { ++i; try { System.out.println("sleeping in main thread..."); Thread.sleep(1000); if (i >= 10) { System.exit(0); } } catch (InterruptedException e) { e.printStackTrace(); } } }
其他需要注意的部分:
1. addShutdownHook() 可以多次调用添加多个任务
2. 多个Hook任务执行顺序不可预知,多线程执行
3. 可以通过 Runtime.getRuntime().removeShutdownHook(hook) 移除任务
4. 如果Shutdown Hook任务已经开始运行,尝试添加移除任务会失败 IllegalStateException
5. 添加和删除任务的操作可能被 SecurityManager 阻止, RuntimePermission("shutdownHooks")
6. Shutdown Hook任务开始运行后,仍然可以通过 Runtime halt() 方法直接退出,System exit() 无法直接退出
7. 正常的关机操作会执行Hook任务,但是任何强制关闭的命令都可能造成Hook任务没有执行或者没有执行结束,JVM 内部错误 Internal Error 也会造成Hook任务没有执行或没有执行结束
相关推荐
JAVA虚拟机关闭钩子(Shutdown Hook).docx
JVM问题诊断常用命令,非常非常值得收藏和深入好好学习学习
终止系统运行的java进程 主要用于windows系统下某些java运行工具下,集成此脚本进行使用。
shutdown.rar
shutdown 命令 设置 自动 关机
本篇文章是对解析Runtime中shutdown hook的使用进行了详细的分析介绍,需要的朋友参考下
shutdown可用于正常退出正在运行的程序(的一部分) 例子 以下示例显示了如何创建新的关闭通道,创建一些分支,订阅一些侦听器以及关闭其中一个分支: use shutdown :: Shutdown; fn main () { let root = ...
windowsxp的关机程序 shutdown.exe
4.CreateProcess、CreateThread、LoadImage、CmpCallback、BugCheckCallback、Shutdown、Lego等Notify Routine信息查看,并支持对这些Notify Routine的删除 5.端口信息查看,目前不支持2000系统 6.查看消息钩子 7....
还可以在执行这些操作时做一些其他事情,如清除IE历史纪录,cookies,IE缓存文件等等。 它可以没有用户登录时,或当计算机是在暂停的节能模式,在计划的时间关闭电脑。它为您提供了不同的方式来安排您的需求,如每天...
我的Consumers程序使用 KCL 方式读取并处理流中数据, RecordProcessor 实现了 IRecordProcessor接口,其中 RecordProcessor.shutdown 方法中调用 checkpoint() ,以实现程序重启时能从上次退出时的处理点开始继续...
电脑设置定时关机,shutdown命令详解
SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机 SHUTDOWN-定时开机关机
shutdown自动关机很好用
ShutDown Expert ShutDown Expert ShutDown Expert
ShutDown.rar 多条件设置定时关机,可设置cpu 使用情况定时关机 挂机者必备工具
列举讲解shutdown的具体应用 shutdown命令的相关参数
部分手机在fastboot模式下在win10(8代CPU)上使用USB3.0接口连接会显示 press any key to shutdown解决方法: 下载修复文件到电脑,右键管理员运行后即可完美解决
此bat文件解决小米miui链接电脑进入fastboot模式时出现press any key to shutdown的问题,以管理员身份运行即可
ShutDown命令详解 设置电脑每天自动定时开机,定时关机