RunTime的回调钩子

写点笔记

共 1536字,需浏览 4分钟

 ·

2021-07-17 23:35

项目运行结束得时候可能需要对一些现有得信息进行保存。比如说我们在java进程退出得时候要保存一些数据,下次启动得时候要用到这些数据得情况。Java在1.3得时候就支持了这种特性。这种特性得实现就在类RunTime中。以下四种方式均可出发runtime得回调。
1)程序正常退出 
        2)使用System.exit() 
        3)终端使用Ctrl+C触发的中断 
        4)系统关闭 
这里我们做个小demo
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方法。
早呀~

浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报