我是靠谱客的博主 动听小兔子,这篇文章主要介绍Java Shutdown Hook设置JVM退出时的操作,现在分享给大家,希望可以做个参考。

我们可以通过调用如下方法设置在JVM准备退出时,运行的操作

 

复制代码
1
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

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部