`
xuanzhui
  • 浏览: 197026 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java Shutdown Hook设置JVM退出时的操作

    博客分类:
  • Java
阅读更多

我们可以通过调用如下方法设置在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任务没有执行或没有执行结束

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics