专栏首页犀牛饲养员的技术笔记一分钟知识点:钩子函数

一分钟知识点:钩子函数

我们在阅读源码的时候,偶尔碰到下面这段代码:

Runtime.getRuntime().addShutdownHook(new Thread() {

            public void run() {
                try {
                    logger.info("## stop the xxxx client");
                    clientTest.stop();
                } catch (Throwable e) {
                    logger.warn("##something goes wrong when stopping xxxx:", e);
                } finally {
                    logger.info("## xxx client is down.");
                }
            }

        });
RunTime.getRunTime().addShutdownHook

的作用是往jvm中添加一个钩子,当jvm关闭的时候(程序退出),jvm会调用所有注册的钩子函数。钩子函数启动一个独立的线程,一般用来做资源的关闭和清理。

因为笔者以前是做c++开发的。所以在了解到java的这个特性的时候,当时第一个想法就是,这特么不就是c++的析构函数吗。

在上面的代码示例中,我们就是在钩子函数里调用客户端的stop方法进行资源清理。

再来看一个例子:

public class RuntimeDemo {

    public static void main(String[] args) throws Exception {
        Runtime.getRuntime().addShutdownHook(new ProcessHook());
        System.out.println("program is running");
        Thread.sleep(2000);
        System.out.println("program is closing");

    }

    static class ProcessHook extends Thread {
        @Override
        public void run() {
            System.out.println("bye,byte");

        }
    }
}

输出,

program is running
program is closing
bye,byte

Process finished with exit code 0

本文分享自微信公众号 - 犀牛饲养员的技术笔记(coder_start_up),作者:siwuxie18

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 几个小细节帮你提升java代码运行效率

    千万不要小看代码细节的优化,有时候一个很小的优化就要你的代码执行效率数倍提升,如果这个优化点调用比较频繁,甚至有可能解决你整个系统的性能瓶颈。

    用户7634691
  • 这可能是讲雪花算法最全的文章

    snowflake中文的意思是 雪花,雪片,所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生成算法。在2014年开源。开源的版本由s...

    用户7634691
  • Elasticsearch中关于JVM和垃圾回收的介绍

    ES官方建议JVM中设置的最大堆内存大小,不超过节点RAM的一半,最大不超过32GB,并且Xms和Xmx相等。我们一个个说明。

    用户7634691
  • SpringBoot+MyBatis通用Mapper3实践浅析

    MyBatis通用Mapper3是对mybaits的数据库操作的一层封装,之前使用时候是根据数据库表生成mapper.xml,mapper的接口类,这个mapp...

    加多
  • Android:CoolWeather天气查看器

    但是由于网络地址的问题一直加载不出来,所以也没法通过安装查看。不过从这个软件还是可以学到很多东西。

    提莫队长
  • JNI--非静态native方法使用及c/c++调用Java变量

    aruba
  • MySQL 5.7和MySQL 8.0的4个细节差异

    在这些年的MySQL升级需求中,让我大跌眼镜的一个现象是:驱动业务从MySQL 5.5升级到MySQL 5.7的很大一个因素是因为JSON这个特性。

    jeanron100
  • hdu1000

    @坤的
  • PHP批量增加、删除、更新数据

    <?php echo “<form method=’post’ name=’form1′ action=’#’>”; echo “<table border...

    苦咖啡
  • ActFramework中实现文件上传

    老码农

扫码关注云+社区

领取腾讯云代金券