一分钟知识点:钩子函数

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

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

从输出结果可以清除的看到程序的退出流程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值