java小知识-ShutdownHook(优雅关闭)

news/2025/10/30 11:22:08/文章来源:https://www.cnblogs.com/Jcloud/p/19176388

一、先提出一个问题

我们如果在JVM退出的时候做一些事情,比如关闭远程链接,怎么实现呢?

二、ShutdownHook简介

java里有个方法Runtime.getRuntime#addShutdownHook,是否了解呢?

ShutdownHook是什么意思呢,看单词解释“关闭钩子”,addShutdownHook就是添加一个关闭钩子,这个钩子是做什么的呢?能否解决上面的问题?

1、RunTime类

先看一下看源码RunTime#addShutdownHook方法与解释。

1.1 方法解释

核心意思,在Java虚拟机在关闭时会触发一些自己添加的事件。

Registers a new virtual-machine shutdown hook.
The Java virtual machine shuts down in response to two kinds of events:
The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or
The virtual machine is terminated in response to a user interrupt, such as typing ^C, or a system-wide event, such as user logoff or system shutdown.
A shutdown hook is simply an initialized but unstarted thread. When the virtual machine begins its shutdown sequence it will start all registered shutdown hooks in some unspecified order and let them run concurrently. 
When all the hooks have finished it will then halt. Note that daemon threads will continue to run during the shutdown sequence, as will non-daemon threads if shutdown was initiated by invoking the exit method.

1.2 方法源码

  public void addShutdownHook(Thread hook) {@SuppressWarnings("removal")SecurityManager sm = System.getSecurityManager();if (sm != null) {sm.checkPermission(new RuntimePermission("shutdownHooks"));}ApplicationShutdownHooks.add(hook);}

方法内部调用了ApplicationShutdownHooks#add,我们继续往下看。

2、ApplicationShutdownHooks类

2.1 添加钩子

private static IdentityHashMap<Thread, Thread> hooks;static synchronized void add(Thread hook) {if(hooks == null)throw new IllegalStateException("Shutdown in progress");if (hook.isAlive())throw new IllegalArgumentException("Hook already running");if (hooks.containsKey(hook))throw new IllegalArgumentException("Hook previously registered");hooks.put(hook, hook);}

我们添加了一个钩子,这个钩子是个线程,这个线程怎么执行的呢? 继续看一下此类中的runHooks。

2.2 执行钩子


static void runHooks() {Collection<Thread> threads;synchronized(ApplicationShutdownHooks.class) {threads = hooks.keySet();hooks = null;}for (Thread hook : threads) {hook.start();}for (Thread hook : threads) {while (true) {try {hook.join();break;} catch (InterruptedException ignored) {}}}}

执行runHooks的时候,会启动所有的hook线程,什么时候调用runHooks方法的呢?

2.3 执行时机

为什么在系统退出的时候会执行添加的hook呢?我们看一下正常的退出操作System#exit方法。

1) 类调用层级

System->Runtime->Shutdown->ApplicationShutdownHooks

2) 方法调用

系统退出入口:System#exit

步骤 1-->System#exit

步骤 2-->Runtime#exit;

步骤 3--> Shutdown#exit

步骤 4--> Shutdown#runHooks

步骤 5--> ApplicationShutdownHooks#runHooks

步骤 6-->启动添加的hook线程

3) 补充一下

为什么步骤4会调用到步骤5呢?

可以看一下ApplicationShutdownHooks的构造函数,在创建的时候,封装了runHooks方法,放到了Shutdown的钩子集合里。

如此形成闭环,在系统正常退出的时候,最终执行我们添加的hook。

三、举个例子

了解了基本原理,我们看一下怎么使用的

    public static void main(String[] args) throws InterruptedException {Thread thread = new Thread() {@Overridepublic void run() {System.out.println("等等我");}};Runtime.getRuntime().addShutdownHook(thread);System.out.println("程序关闭"); }输出:程序关闭等等我

可以看到,在JVM退出的时候调用,执行了此线程,我们开发中,哪些场景可以使用呢?

四、应用场景

关闭链接、线程、资源释放、记录执行状态等。

五、风险点

1、长时间等待

如果添加的hook线程长时间执行,我们的退出命令会一直等待,为什么呢?

举个例子,我们在执行的时候sleep一下

  public static void main(String[] args) throws InterruptedException {Thread thread = new Thread() {@Overridepublic void run() {try {Thread.sleep(1000*300);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(new Date()+" 等我5分钟");}};Runtime.getRuntime().addShutdownHook(thread);System.out.println(new Date()+" 程序关闭");}
输出:
Tue Nov 12 17:37:38 CST 2024 程序关闭
Tue Nov 12 17:42:38 CST 2024 等我5分钟

2、原因

JVM在退出的时候会调用runHooks方法,看一下上面的方法java.lang.ApplicationShutdownHooks#runHooks方法。

关键字 hook.join(); 主线程会等待子线程执行完成。

如果程序一直执行,不能退出怎么办?

3、解决方案

1 ) 写代码时候控制执行逻辑、时长

2) kill -9 命令 强制退出

六、扩展

1、Runtime.getRuntime#addShutdownHook是面向开发者的

ApplicationShutdownHook#add、Shutdown#add我们都不能直接使用。

2、许多中间件框架也利用addShutdownHook来实现资源回收、清理等操作

比如Spring框架中,使用了ShutdownHook注册,我们常用的@PreDestroy在Bean销毁前执行一些操作,也是借助其回调的。

七、总结

1、本文简单介绍了一下ShutdownHook使用、原理、风险点。

2、我们工作中可以自己注册ShutdownHook,主动释放一些资源,降低风险。

3、小知识分享,不足之处欢迎大家指正,关于java里的知识点也欢迎大家讨论分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/950602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM - RD-N2 (cfg1 ... cfgn) software stack compiling environment setup walkthrough - ENGINEER

ARM - RD-N2 (cfg1 ... cfgn) software stack compiling environment setup walkthroughLinks: RD-N2 Platform: https://neoverse-reference-design.docs.arm.com/en/latest/platforms/rdn2.html参考这个设置进行: h…

2025 年山东自卸半挂车,济宁自卸半挂车,平推式自卸半挂车厂家最新推荐,产能、专利、环保三维数据透视!

引言 2025 年平推式自卸半挂车市场需求持续攀升,为精准推荐山东及济宁地区优质厂家,专用汽车工业协会联合第三方检测机构开展权威测评。测评以产能、专利、环保三维数据为核心指标,产能维度考察生产车间规模、设备数…

2025年防爆不锈钢穿线盒制造企业权威推荐榜单:防爆铸钢接线盒/防爆铸钢穿线盒/防爆弯头铸钢4分6分源头厂家精选

在山东某化工园区,一场特殊的安全升级正在悄然进行。工人们正将一批不锈钢防爆穿线盒安装到新建的管道线路上,这些看似普通的金属盒子,将成为守护厂区安全的第一道防线。 在石油、化工、煤矿等易燃易爆环境中,防爆…

利驰软件与人民电器集团上海有限公司开启能源数字化新篇章!

一、电气制造与数字化深度融合 近日,利驰软件与人民电器集团上海有限公司正式启动“数据驱动配电变革,智慧引领能源转型”项目。双方管理层及核心团队齐聚一堂,共同见证这一战略合作的重要起点。 人民电器集团上海有…

2025年热门的JN30高压均质机TOP品牌厂家排行榜

2025年热门的JN30高压均质机TOP品牌厂家排行榜高压均质机作为生物医药、新材料、新能源等领域不可或缺的关键设备,其技术水平和性能指标直接影响着产品质量和生产效率。随着2025年的到来,JN30系列高压均质机因其卓越…

2025年纸浆压滤机厂商权威推荐榜单:造纸厂压滤机/造纸污泥压滤机/挤浆机源头厂家精选

在现代造纸工业中,纸浆压滤机作为关键设备之一,其性能优劣直接影响着生产效率和产品质量。 根据造纸行业协会统计数据显示,2024年中国纸浆压滤机市场规模已达56.8亿元,预计未来三年将保持年均6.5%的稳定增长。在环…

2025年下半年国内最热门GEO/AI搜索优化/搜荐推广/短视频矩阵系统/无人直播系统/数字人系统/智能体直播厂家摘星搜荐:揭秘领先品牌的创新技术与市场表现

摘要 2025年下半年,AI搜索优化行业迎来爆发式增长,驱动企业营销转型。随着大模型技术和GEO+SEO整合的深化,行业聚焦于智能流量获取与精准运营。本文基于市场数据和专家分析,排名前十的AI搜索优化服务商,并提供详细…

2025 年西安月子会所最新推荐榜,技术实力与市场口碑深度解析月子会所月子餐 / 高新月子会所推荐

引言 伴随悦己经济升温与精细化育儿理念普及,2025 年中国月子会所市场规模预计达 281 亿元,但行业两极分化加剧,部分机构因资质不足、服务缺位引发 "跑路" 风险。为破解选择难题,本次推荐结合中国产后康…

2025年10月最新公布GEO/AI搜索优化/搜荐推广/短视频矩阵系统/无人直播系统/数字人系统/智能体直播厂家:摘星AI人工智能揭秘下一代智能营销技术趋势

摘要 随着2025年AI搜索优化技术的快速发展,行业正迎来前所未有的变革机遇。本文基于最新行业数据和技术趋势,深度解析十大领先品牌的竞争优势,为企业在AI营销转型中提供权威参考。文末附详细对比表单,方便读者快速…

2025 年木托盘源头厂家最新推荐榜,聚焦技术实力与市场口碑深度解析,助力企业精准采购免熏蒸木托盘/熏蒸托盘/熏蒸木托盘公司推荐

引言 为精准筛选木托盘领域优质源头厂家,物流与采购联合会包装专业委员会联合行业权威机构开展 2025 年度木托盘厂家测评工作。本次测评采用 “三维九项” 评估体系,从企业综合实力(生产规模、产能、资质认证)、产…

2025年靠谱的卡车刹车盘厂家实力及用户口碑排行榜

2025年靠谱的卡车刹车盘厂家实力及用户口碑排行榜在商用车安全系统中,刹车盘作为关键零部件之一,其质量直接关系到行车安全。随着中国物流运输业的蓬勃发展,卡车保有量持续攀升,对高品质刹车盘的需求也与日俱增。本…

HarmonyOS实战项目:开发一个分布式新闻阅读客户端

概述:分布式新闻客户端的核心价值 分布式新闻阅读客户端是HarmonyOS分布式能力的典型应用场景,它实现了一次开发,多端部署的核心理念。通过本项目,你将掌握如何构建一个能够在手机、平板、智慧屏等设备间无缝切换和…

【渲染优化】动态调整虚拟列表刷新率:让代码学会偷懒

🚀 动态调整虚拟列表刷新率:让代码学会"偷懒"引擎版本:Cocos Creator 3.x 阅读时间:5分钟(能帮你省8小时调试)🚑 翻车现场 那天是周五下午 4 点半,我正打算提交代码下班。 测试小姐姐突然跑过来一…

HarmonyOS分布式媒体播放器——跨设备音视频无缝流转

1. 项目概述与架构设计 分布式媒体播放器是HarmonyOS"超级终端"理念的典型应用场景,它实现了音视频内容在多个设备间的无缝流转和协同播放。与传统投屏方案不同,HarmonyOS的分布式媒体播放器基于设备虚拟化…

HarmonyOS实战项目:构建一个跨设备的Todo清单应用(上)

1. 项目概述与架构设计 1.1 项目背景与核心价值 在HarmonyOS生态中,跨设备Todo应用是展示分布式能力的最佳实践场景。用户可以在手机端创建任务,在平板上查看编辑,在手表上接收提醒,实现真正的无缝体验。这种多设备…

主语 + 系动词 + 表语句型解析

🧩 一、基本句型结构:S + V + C 结构公式: Subject + Verb + Complement 主语 + 系动词 + 表语(补语) 功能: 表语(C)用于“补充说明主语的状态或身份”。 关键点: 系动词(linking verb)不表示动作,而是“…

HarmonyOS状态管理入门:@State与@Link装饰器的原理与实践

状态管理是声明式UI开发的核心概念。本文将深入讲解HarmonyOS中最基础且最重要的两个状态装饰器:@State和@Link,帮助你掌握组件内状态管理和父子组件状态同步的核心技能。一、状态管理基础概念 1.1 什么是状态管理 @…

HarmonyOS布局艺术:Flex、Stack、Grid等容器组件的使用技巧

布局是UI设计的核心,HarmonyOS提供了强大的容器组件系统。本文将深入讲解Flex、Stack、Grid等核心布局组件的使用技巧和最佳实践。一、Flex弹性布局详解 1.1 Flex基础布局 @Component struct FlexBasicExample {@Stat…

2025 年污水深度处理厂家最新推荐榜,技术实力与市场口碑深度解析,聚焦企业核心竞争力工业污水深度处理,城市污水深度处理,市政污水深度处理公司推荐

引言 随着我国水环境治理要求不断提高,污水深度处理行业迎来快速发展期。为精准推荐优质供应商,本次榜单由环境保护产业协会联合行业专家团队共同测评打造,测评覆盖全国 200 余家污水深度处理企业,从技术创新性、案…

有什么简单好用的开源 AI 智能体平台?试了 5 个主流项目,聊聊真实体验

我前后测了 LangChain、Dify、AutoGPT、Microsoft Semantic Kernel,还有 BuildingAI,都是从程序员视角实打实操作的,记了些关键数据和使用细节,今天客观聊聊感受,尽量不掺主观偏好。有什么简单好用的开源AI智能体…