我们开发的系统有时候会有进程挂掉的情况发生,换句话说就是我们的虚拟机进程over了,此时如果我们想要在进程关闭的时候执行某些如资源清理操作,那么我们可以使用Java提供的钩子Hook解决方方案。
JDK 提供了addShutdownHook(Thread thread)
方法用于注册一个钩子,当Java进程关闭的时候,这些钩子将会被执行,但是,在进程正常运行的过程中,这些钩子是不会启动的。那么这些钩子在哪些情况下会被触发呢?大致有下面几点:
- 1、程序正常运行结束
- 2、关闭虚拟机进程,如程序中调用了
System.exit(status)
方法 - 3、用户中断了虚拟机进程,如执行了
ctrl+C
操作、系统关闭或者操作系统宕机
下面我举两个例子演示下面两种情况:
- 1、程序正常退出
RuntimeHookTest.java
public class RuntimeHookTest { public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { System.err.println("The Java VM shutdown normally!"); } })); }}复制代码
- 2、用户按下
ctrl + c
退出程序
``
public class RuntimeHookTest { public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { System.err.println("The Java VM has been interupted."); } })); while (true) { // 模拟程序一直运行 } }}复制代码