1. 作用
利用 java.lang.Runtime.addShutdownHook() 钩子程序,可以在JVM正常退出时做一些事情,JVM关闭方式有一下三种:
- 正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(发送SIGINT(2),SIGTERM(15)信号等)
- 强制关闭:通过调用Runtime.halt方法或者是在操作系统中直接kill(发送SIGKILL(9)信号)掉JVM进程
- 异常关闭:运行中遇到RuntimeException异常等。
2. 示例
关闭钩子只在JVM正常关闭时才会执行,因此假如用kill -9强杀是不会执行的,kill -15可以。
import java.util.concurrent.TimeUnit
public class Hook {
public static void main(String[] args) throws InterruptedExeption {
Runtime.getRuntime().addShutdownHook(new Thread( () -> {
System.out.println("doing exit hook");
}));
while (true) {
TimeUnit.SECONDS.sleep(1);
System.out.println("666");
}
}
}
当用kill -15结束进程时钩子程序运行,kill -9强杀不运行。