我们可以通过调用如下方法设置在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系统的属性设置和JVM启动时的命令行参数,对于理解程序运行环境和进行故障排查非常有用。 **基本用法**: ``` jinfo [option] jinfo [option] <executable> jinfo [option] [server-id@] ``` ...
`Shutdown Hook`是JVM在接收到退出信号(如用户按下Ctrl+C,或者操作系统关闭命令)时执行的一组线程。你可以通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的`Thread`,在程序退出前进行必要...
值得注意的是,虽然`shutdown hook`提供了在JVM退出前执行清理操作的能力,但它们并不是万能的。例如,如果JVM由于内存溢出或其他严重错误而异常退出,`shutdown hook`可能不会执行。此外,`shutdown hook`的执行...
15. **关闭钩子(Shutdown Hook)**:通过`Runtime.getRuntime().addShutdownHook(Thread hook)`注册自定义的关闭钩子,这些钩子在JVM关闭时执行,用于清理资源。 16. **精灵线程(Daemon Thread)**:精灵线程是不...
- `wrapper.disable_shutdown_hook`: 是否禁用JVM的关闭钩子。 - `wrapper.console.loglevel`: 控制台日志级别。 5. **动态更新配置**: 在有自动更新功能的项目中,如果新插件的类路径需要更新,可以通过Java类...
"shutdown-app"是一个在Java开发环境中常见的应用关闭命令或者程序模块。这个名称通常与系统管理、服务停止或者进程控制相关。在Java世界里,我们经常需要优雅地关闭应用程序,以确保资源的正确释放和必要的清理工作...
1. **Shutdown Hooks**:Java提供了JVM关闭钩子(Shutdown Hooks),允许在JVM退出之前执行清理任务。在Spring Boot中,可以通过实现`DisposableBean`接口或者使用`@PreDestroy`注解的方法来注册这些钩子。当应用...
JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用: 1)程序正常退出 2)使用System.exit() 3)终端使用Ctrl+C触发的...
介绍 此项目是利用业余时间,对一些技术知识点进行整理,用来记录个人学习笔记。这个项目和 项目的不同在于 是用来动手实践,对于一些技术的实际搭建和造轮子的项目,正...Java虚拟机关闭钩子(Shutdown hook) 公众号
Java虚拟机(JVM)在接收到退出指令时,会尝试执行所有注册的关闭钩子,这些钩子通常是实现`Runnable`接口的线程对象。 **关闭钩子的生成步骤**: 1. 创建一个继承自`Thread`的子类。 2. 在子类中实现`run`方法,...
最后,为了确保在Java虚拟机关闭的时候能够释放资源并关闭WatchService,应该在程序中增加一个关闭钩子(shutdown hook),确保在JVM关闭的时候能够执行资源释放的相关操作,特别是关闭WatchService。 下面是一个...
6. ShutdownHook:为了优雅地关闭线程池,通常会注册一个JVM关闭钩子(Shutdown Hook),在程序退出前,线程池能够完成正在执行的任务并清理资源。 通过研究ExecuteFramework-master源码,我们可以学习到如何设计和...