往往在程序运行时,一些运行异常造成服务停止,但是资源为来得及释放,或者无法通知,这样会不友好。通过JDK中的Runtime.getRuntime().addShutdownHook()方法进行资源释放或者发送消息通知
/**
* @Author: MR LIS
* @Description:
* @Date: Create in 17:46 2018/4/20
* @Modified By:
*/
public class ExitCapture {
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(()->{
System.out.println("The application will be exit.");
notifyAndRelease();
}));
// int i=0;
while (true) {
try {
Thread.sleep(1_000L);
System.out.println("I am working");
} catch (Throwable throwable) {
}
// i++;
//模拟演示循环20次后抛出异常,实际情况不需要
/* if(i>20)
throw new RuntimeException("run error");*/
}
}
private static void notifyAndRelease() {
System.out.println("notify to admin");
try {
Thread.sleep(1_000L);
} catch (Throwable throwable) {
}
System.out.println("release resource、socket、connection and so on");
}
}
执行结果如下
在linux上通过 kill 进程号 ,和模拟演示中20次一样的效果(程序注释掉的部分),但是如果使用强杀进程,该钩子程序就没有作用,强杀:kill -9 进程号。实际项目中程序抛出异常和 kill 进程号一样的效果