一、ShutdownHook的用途
在很多实际应用环境中,当用户关闭了应该用程序时,需要做一些善后清理工作,但实际上程序很可能并不是按照设想中那样正常的关闭,导致清理工作不起作用,这时ShutdownHook就派上了用场。
jvm会在以下退出情况下调用ShutdownHook事件:
- 最后一个非守护进程线程退出或调用exit(相当于system.exit)方法时,程序正常退出
- 虚拟机因响应用户中断(如键入ctrl + c)或系统范围的事件(如用户注销或系统关闭)而终止。
二、代码实现
定义一个ShutdownHook
ShutdownHook.java
package com.zhuyun.hook;
public class ShutdownHook extends Thread{
@Override
public void run() {
System.out.println("项目关闭啦");
}
}
测试代码ShutdownHookDemo.java
package com.zhuyun.hook;
import java.io.IOException;
public class ShutdownHookDemo {
public static void main(String[] args) {
System.out.println("项目启动了");
ShutdownHook shutdownHook = new ShutdownHook();
//注册一个ShutdownHook
Runtime.getRuntime().addShutdownHook(shutdownHook);
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、测试结果
第一种情况:正常退出
第二种情况:System.exit(0)方法退出
在代码中,将System.in.read()改成System.exit(0),执行结果如下:
第三种情况:ctrl + c 退出
将System.exit(0)再改回成System.in.read(),然后在程序阻塞的时候键入ctrl + c,结果如下:
第四种情况:kill掉进程
从上述结果可以看出,第四种情况不会触发ShutdownHook事件,其他三种情况都可以触发。