java程序退出时执行

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

补充

深入理解可以读这个:

你可能感兴趣的:(Java)