概述
我们可以通过调用如下方法设置在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设置JVM退出时的操作的全部内容,希望文章能够帮你解决Java Shutdown Hook设置JVM退出时的操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复