ShutdownHook原理

Java程序中的ShutdownHook允许在进程结束时执行清理任务。本文详细介绍了ShutdownHook的原理,包括其数据结构、执行顺序、触发点,如Shutdown.exit和Shutdown.shutdown。ShutdownHook在进程主动退出、接收到系统信号或所有非守护线程结束后会被执行,但无法在被kill -9强制结束时执行。理解ShutdownHook的工作机制对于确保程序优雅退出和资源释放至关重要。
摘要由CSDN通过智能技术生成

ShutdownHook介绍

在java程序中,很容易在进程结束时添加一个钩子,即ShutdownHook。通常在程序启动时加入以下代码即可

Runtime.getRuntime().addShutdownHook(new Thread(){
    @Override
    public void run() {
        System.out.println("I'm shutdown hook...");
    }
});

有了ShutdownHook我们可以

  • 在进程结束时做一些善后工作,例如释放占用的资源,保存程序状态等
  • 为优雅(平滑)发布提供手段,在程序关闭前摘除流量

不少java中间件或框架都使用了ShutdownHook的能力,如dubbo、spring等。

spring中在application context被load时会注册一个ShutdownHook。
这个ShutdownHook会在进程退出前执行销毁bean,发出ContextClosedEvent等动作。
而dubbo在spring框架下正是监听了ContextClosedEvent,调用dubboBootstrap.stop()来实现清理现场和dubbo的优雅发布,spring的事件机制默认是同步的,所以能在publish事件时等待所有监听者执行完毕。

ShutdownHook原理

ShutdownHook的数据结构与执行顺序

  • 当我们添加一个ShutdownHook时,会调用ApplicationShutdownHooks.add(hook),往ApplicationShutdownHooks类下的静态变量private static IdentityHashMap<Thread, Thread> hooks添加一个hook,hook本身是一个thread对象
  • ApplicationShutdownHooks类初始化时会把hooks添加到Shutdown的hooks中去,而Shutdown的hooks是系统级的ShutdownHook,并且系统级的ShutdownHook由一个数组构成,只能添加10个
  • 系统级的ShutdownHook调用了thread类的run方法&
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值