项目运行结束得时候可能需要对一些现有得信息进行保存。比如说我们在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方法。
早呀~