`
xuanzhui
  • 浏览: 201420 次
  • 性别: 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任务没有执行或没有执行结束

 

 

 

 

分享到:
评论

相关推荐

    JVM问题诊断常用命令

    它可以用来查看Java系统的属性设置和JVM启动时的命令行参数,对于理解程序运行环境和进行故障排查非常有用。 **基本用法**: ``` jinfo [option] jinfo [option] <executable> jinfo [option] [server-id@] ``` ...

    java 程序的退出的资源

    `Shutdown Hook`是JVM在接收到退出信号(如用户按下Ctrl+C,或者操作系统关闭命令)时执行的一组线程。你可以通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的`Thread`,在程序退出前进行必要...

    解析Runtime中shutdown hook的使用详解

    值得注意的是,虽然`shutdown hook`提供了在JVM退出前执行清理操作的能力,但它们并不是万能的。例如,如果JVM由于内存溢出或其他严重错误而异常退出,`shutdown hook`可能不会执行。此外,`shutdown hook`的执行...

    JAVA并发编程实践-线程的关闭与取消-学习笔记

    15. **关闭钩子(Shutdown Hook)**:通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的关闭钩子,这些钩子在JVM关闭时执行,用于清理资源。 16. **精灵线程(Daemon Thread)**:精灵线程是不...

    将Java程序注册成系统服务.pdf

    - `wrapper.disable_shutdown_hook`: 是否禁用JVM的关闭钩子。 - `wrapper.console.loglevel`: 控制台日志级别。 5. **动态更新配置**: 在有自动更新功能的项目中,如果新插件的类路径需要更新,可以通过Java类...

    shutdown-app

    "shutdown-app"是一个在Java开发环境中常见的应用关闭命令或者程序模块。这个名称通常与系统管理、服务停止或者进程控制相关。在Java世界里,我们经常需要优雅地关闭应用程序,以确保资源的正确释放和必要的清理工作...

    graceful-shutdown-spring-boot:使用Spring Boot正常关闭(演示)

    1. **Shutdown Hooks**:Java提供了JVM关闭钩子(Shutdown Hooks),允许在JVM退出之前执行清理任务。在Spring Boot中,可以通过实现`DisposableBean`接口或者使用`@PreDestroy`注解的方法来注册这些钩子。当应用...

    Java应用中使用ShutdownHook友好地清理现场

     JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用:  1)程序正常退出  2)使用System.exit()  3)终端使用Ctrl+C触发的...

    blog:日常工作中使用的技术沉淀+学习记录

    介绍 此项目是利用业余时间,对一些技术知识点进行整理,用来记录个人学习笔记。这个项目和 项目的不同在于 是用来动手实践,对于一些技术的实际搭建和造轮子的项目,正...Java虚拟机关闭钩子(Shutdown hook) 公众号

    通过JDK源码分析关闭钩子详解

    Java虚拟机(JVM)在接收到退出指令时,会尝试执行所有注册的关闭钩子,这些钩子通常是实现`Runnable`接口的线程对象。 **关闭钩子的生成步骤**: 1. 创建一个继承自`Thread`的子类。 2. 在子类中实现`run`方法,...

    Java利用WatchService监听文件变化示例

    最后,为了确保在Java虚拟机关闭的时候能够释放资源并关闭WatchService,应该在程序中增加一个关闭钩子(shutdown hook),确保在JVM关闭的时候能够执行资源释放的相关操作,特别是关闭WatchService。 下面是一个...

    java多线程源码-ExecuteFramework:java多线程框架核心源码重写

    6. ShutdownHook:为了优雅地关闭线程池,通常会注册一个JVM关闭钩子(Shutdown Hook),在程序退出前,线程池能够完成正在执行的任务并清理资源。 通过研究ExecuteFramework-master源码,我们可以学习到如何设计和...

Global site tag (gtag.js) - Google Analytics