JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在一下几种场景中被调用:
- 程序正常退出
- 使用System.exit()
- 终端使用Ctrl+C触发的中断
- 系统关闭
- OutOfMemory宕机
- 使用Kill pid命令干掉进程(注:在使用kill -9 pid时,是不会被调用的)
这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁、关闭连接等操作。
public static void main(String[] args) {
//Shutdown hook demo
Thread thread1 = new Thread() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("thread1...");
}
};
System.out.println("main开始");
try {
thread1.start();
thread1.join();
} catch (Exception ex) {
ex.printStackTrace();
}
System.out.println("main即将结束");
//定义shutdownhook
Thread shutdownThread = new Thread() {
@Override
public void run() {
System.out.println("Shutdown hook");
}
};
Runtime.getRuntime().addShutdownHook(shutdownThread); //注册钩子
System.out.println("main结束");
}
输出结果
main开始
thread1...
main即将结束
main结束
Shutdown hook