java程序退出时执行
描述
对于程序退出前执行特定过程, C++中有析构方法,java中可以使用Runtime中的addShutdownHook(Thread hook) 向JVM注册一个关闭的线程事件,程序一旦结束 时,线程hook就会被执行,处理最后的事情。
程序结束是指程序删除线格式 自然结束或者System.exit(0)、System.exit(-1) 或者Runtime.getRuntime().exit(-1)、Runtime.getRuntime().exit(0)等。即使是程序异常退出,只要退出前addShutdownHook(t)已经注册过,程序退出事件依旧会被触发。
使用
public class Test {
public static void main(String[] args) {
new BeforeEnd();//放的位置决定是否会被触发
try {
//任务一:模拟数据导出
System.out.println("数据正在导出...");
Thread.sleep(5 * 1000);//模拟处理时间
System.out.println("数据导出完成!!!");
//System.exit(0);//0和-1都会触发退出事件处理
//Runtime.getRuntime().exit(-1);//0和-1都会触发退出事件处理
//任务二:打印报告
System.out.println("开始打印报告...");
Thread.sleep(5 * 1000);//模拟处理时间
System.out.println("报告打印完成!!!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
class BeforeEnd {//程序退出事件处理
BeforeEnd() {
//模拟处理时间
Thread t = new Thread(() -> {
try {
//模拟正常终止前任务
System.out.println("程序即将终止...");
System.out.println("正在处理最后的事情...");
Thread.sleep(5 * 1000);//模拟处理时间
System.out.println("end...");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Runtime.getRuntime().addShutdownHook(t);
}
}
结果
结果:
数据正在导出...
数据导出完成!!!
开始打印报告...
报告打印完成!!!
程序即将终止...
正在处理最后的事情...
end...
Process finished with exit code 0