Runtime.getRuntime().addShutdownHook简介

前言:

在使用线程池的时候,偶然看到了前人的代码里出现了Runtime.getRuntime().addShutdownHook()。

作用:

jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。

使用场景:

多用于内存清理,对象销毁等等。

示例:

以线程池在进程关闭时的处理。
上代码:

    private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3);
    static {
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {

            @Override
            public void run() {
                close();
            }
        }));
    }

    private static void close() {
        try {
            System.out.println("clean");
            executorService.shutdown();
            System.out.println(executorService.awaitTermination(10000, TimeUnit.SECONDS));
            System.out.println("end");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            final int index = i;
            try {
                executorService.schedule(new Runnable() {

                    @Override
                    public void run() {
                        System.out.println("yes" + index);

                    }
                }, 3, TimeUnit.SECONDS);
                System.out.println("add thread");
            } catch (Exception e) {
            }

        }

    }

代码的具体意思,不做展开,我们看结果(我们在第8次增加任务的时候,手动kill掉这个进程)
add thread
add thread
add thread
yes0
add thread
yes1
add thread
yes2
add thread
yes3
add thread
yes4
add thread
clean
yes5
yes6
yes7
true
end

我们可以看到,当kill掉进程之后,调用了close的方法。这个代码的作用,是当进程关闭时,我们将线程池中已经添加的任务继续执行完毕,然后关闭线程池。他的作用是防止已添加的任务丢失。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 4,336评论 0 3
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 6,778评论 0 11
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,475评论 11 349
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,900评论 25 709
  • 1、板栗,最好在两餐之间吃; 2、腰果,先吃一两粒后停十几分钟再吃; 3、松子,存放时间长不宜食用; 4、花生,吃...
    健康快乐随梦飞翔阅读 1,313评论 0 0