我们开发的系统有时候会有进程挂掉的情况发生,换句话说就是我们的虚拟机进程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) {
// 模拟程序一直运行
}
}
}
复制代码