RunTime的回调钩子

2022-08-11 16:58:56 浏览数 (1)

项目运行结束得时候可能需要对一些现有得信息进行保存。比如说我们在java进程退出得时候要保存一些数据,下次启动得时候要用到这些数据得情况。Java在1.3得时候就支持了这种特性。这种特性得实现就在类RunTime中。以下四种方式均可出发runtime得回调。

1)程序正常退出 2)使用System.exit() 3)终端使用Ctrl C触发的中断 4)系统关闭

这里我们做个小demo

代码语言:javascript复制
public class TestRunTime {

    static class MyThreadOne extends Thread{

        public void run(){
            System.out.println("stop thread one~~~~");
        }
    }
    static class MyThreadTwo extends Thread{

        public void run(){
            System.out.println("stop thread two~~~~");
        }
    }
    public static void main(String[] args) {
        MyThreadOne myThreadOne=new MyThreadOne();
        MyThreadTwo myThreadtwo=new MyThreadTwo();
        Runtime.getRuntime().addShutdownHook(myThreadOne);
        Runtime.getRuntime().addShutdownHook(myThreadtwo);
    }
}

我们测试一下代码:

看完上边得示例呐,我们看看这个Runtime有那些方法。

私有化自己,这个应该在jvm中直接掉用了。

提供了很多方法,有执行操作系统命令得,有获取内存容量得、退出jvm的,类加载的、垃圾回收的以及我们这里说到的jvm回调钩子。

在添加钩子的的时候,我们看到这里的ApplicationShutDownHooks类。

通过查看代码,发现我们可以添加多个钩子线程。

为了让钩子的添加能够被shutdow类检测,所以这块采用静态块将钩子的运行引用到Shutdown类中。我们jvm最终停止触发的钩子回调应该跟这个shutdown有很大关系。至于这里的runHooks方法就是遍历执行我们的回调线程了哈。

通过查看源代码,发现这块完全可以在Shutdown类中钩子任务。在jvm停机的时候会走runHooks方法。既然有个shutdown了,那为啥还要弄个ApplciationShutdownHooks呐,我的理解就是解耦合。

至于jvm最后回调的是什么方法,个人觉得应该是这里的exit方法。

早呀~

jvm

0 人点赞