Runtime.getRuntime().addShutdownHook(new Thread())用法

Runtime.getRuntime().addShutdownHook简介 前言: 在使用线程池的时候,偶然看到了前人的代码里出现了Runtime.getRuntime().addShutdownHook()。 作用: jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。 使用场景: 多用于内存清理,对象销毁等等。 示例: 以线程池在进程关闭时的处理。 上代码: private static Sche 阅读详情

首先说明这个Runtime.getRuntime().addShutdownHook(new Thread())方法是用来捕捉程序退出的时刻,在程序退出的时候处理必要的退出准备,如关闭网路,关闭文件等。

那对于我们来讲,我们平时是怎么退出程序的,正常来讲是让程序正常退出,或者执行System.exit(0)来结束程序,我们来演示一下:

package runtimetest;

public class Test {
    public static void main(String[] args) {
        ExitTest exitTest=new ExitTest();
        exitTest.et();
        System.out.println("程序正常退出");
//        System.exit(-10);//这里相当于指定状态,如果不适用这一句,默认状态是0
    }

}
class ExitTest{
    public void et(){
        System.out.println("这是一个退出程序");
    }
}
  • 这里是执行之后的结果:
    在这里插入图片描述

上述的方法可以实现程序退出操作,但是当我们使用多线程的时候,或者在实际业务中我们难知道程序是什么时候结束的,但是又很需要捕捉程序退出的一刻对程序进行必要处理,
java提供了一个程序退出处理机制:Runtime.getRuntime().addShutdownHook(new Thread()),首先通过Runtime.getRuntime()获得当前的程序对象(这是一个静态方法),然后通过Runtime中的void addShutdownHook(Thread hook)方法来向java的虚拟机(JVM)注册一个shutdown的钩子事件,这样程序一旦结束,就会运行线程hook。在实际业务中,我们只需要将程序结束之前需要做的一些工作放在线程hook来完成就可以了。下面我们来演示一下:

package runtimetest;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;

public class ShutdownHookTest {
    //构造方法
    public ShutdownHookTest(){
        doShutdownWork();
    }
    private void doShutdownWork(){
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            try {
                long start = System.currentTimeMillis();
                long end = System.currentTimeMillis();
                System.out.println("打印处理的时间:"+(end - start));
            } catch (Exception e) {
            }
        }));

        Runtime.getRuntime().addShutdownHook(new Thread(()->{
           try {
               System.out.println("这里执行程序退出前的处理程序");
           } catch (Exception e) {
               e.printStackTrace();
           }
        }));

        Runtime.getRuntime().addShutdownHook(new Thread() {
            public void run() {
                try {
                //写到日志文件
                    FileWriter fw = new FileWriter("E://ideaworkspace//src//runtimetest//t.log");
                    System.out.println("I'm going to end");
                    fw.write("the application ended! " + (new Date()).toString());
                    fw.close();
                }
                catch (IOException ex) {
                }

            }
        });

    }
}

  • 这里是测试程序,这里只是建立一个处理程序的对象,而不需要直接调用具体处理退出程序的方法,就可以实现退出程序前对程序处理
package runtimetest;

public class Test {
    public static void main(String[] args) {
        ShutdownHookTest shutdownHookTest=new ShutdownHookTest();
        long start =System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            System.out.print(i+" ");
        }
        long end =System.currentTimeMillis();
        System.out.println();
        System.out.println("main"+(end-start));
    }

}

在这里插入图片描述

就好比我实例的一样,我们的关机构可以不只是一个,可以同时注册多个关机构,在JVM退出之前,它会启动所有的已注册的关机构,并且让这些关机构同步执行
shutdownhook(关机钩)的主要目的是在系统中断后进行必要的清除,例如进行网络关闭、关闭打开的文件等操作,可以通过在一个关机钩执行之前可以使用removeShutdownHook()来删除一个已注册的关机钩,也可以调用halt()不调用关机钩线程直接退出JVM。

导致Runtime.getRuntime().addShutdownHook无法执行的场景 PS:搜索了一下windows中的结束任务和linux中kill -9的区别,14个AI大模型的回答都是一致的:linux中的kill -9比windows任务管理器中的结束任务要更凶更猛,虽然没有在linux系统去实验,但是根据这个结论,如果在linux系统使用kill -9命令来杀死jvm,那么钩子函数就不会执行了。2、在oom之后注册钩子函数:-Xmx10000k,无法执行。1、在OOM之前注册钩子函数:-Xmx10000k,正常执行。4、任务管理器结束运行:没能执行。 阅读详情

相关推荐

Zabbix在Ubuntu 22.04上的性能优化与监控实战:从基础安装到高级配置

本文详细介绍了在Ubuntu 22.04系统上部署和优化Zabbix监控系统的完整流程,从基础安装到高级配置。内容包括MySQL数据库设置、Zabbix服务器与Web前端优化、性能调优策略以及实战监控场景应用,帮助用户构建高效的企业级监控解决方案。

sss66的博客 894

高并发编程-Runtime.getRuntime().addShutdownHook为自己的应用添加hook

文章目录概述使用场景注意事项示例 概述 一句话概括就是: ShutdownHook允许开发人员在JVM关闭时执行相关的代码。 我们可以使用java.lang.Runtime.getRuntime().addShutdownHook(Thread t)方法在JVM中添加关闭钩子。 使用场景 1.程序正常退出 , JVM关闭 2. 调用System.exit ,JVM关闭 3. 程序抛出异常,导致...

小工匠 2万+

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 295

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

最近在跟着一个大神专栏在学习手敲spring,看到这个Runtime.getRuntime().addShutdownHook 以前还真不知道,记录下来。 百度知识点原文:https://www.cnblogs.com/shihaiming/p/11398371.html 钩子函数:Runtime.getRuntime().addShutdownHook, 作用:当我们程序在运行完之后,如果需要做清理内存,清理线程,或者做业务上的清理工作的话,就可以用这个钩子函数。 执行时间:jvm关闭前 其中

hq091117的博客 814

RK3568开发笔记- (TX/RX) RGMII delayline 功能调试

本文详细介绍了RK3568芯片RGMII接口delayline功能的调试过程。针对千兆以太网通信不稳定问题,通过分析RGMII时序要求,利用RK3568内置的delayline功能补偿信号延迟。调试方法包括扫描delayline窗口、测试中间值配置、优化硬件设计等步骤。文章还总结了常见问题解决方案,如PHY选型建议和自动扫描功能配置。最终实现了千兆速率下丢包率降至0.01%以下的目标,为类似开发场景提供了实用参考。

flypig has a dream! 316

人像抠图 + OpenGL ES 还能这样玩?没想到吧(附带源码)

OpenGL ES 利用抠图算法实现人像留色。

字节流动 3万+

RunTime.getRunTime().addShutdownHook的用法

RunTime.getRunTime().addShutdownHook的用法_常识的Blog的博客-优快云博客

u010730870的博客 2844

你的小龙虾 OpenClaw 还很笨?快给它装上这几个核心技能(OpenClaw 必装skills整理)

🦞 刚装小龙虾OpenClaw? 本文分享一些OpenClaw必装技能,从视觉理解到智能学习,让它从“会聊天”变“会干活” 🚀

XiaoqiangClub的博客 869

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

为您的Java应用程序添加退出事件处理 -------------------------------------------------------------------------------- 一个完整的Java应用程序,通常至少要有一个应用程序的结束点。对于一般程序来说,系统开发者根据需要和个人的偏好,会 在程序结束位置,通过添加System.exit(0),或System.out

疯子阳1991 4442

Agent应用实践之三 - 基础:AgentScope-ReActAgent源码解析

本章通过总结AgentScope的核心类,再通过分析ReActAgent调用大模型的底层源码原理。使我们基本了解了Agent的基本原理,这个实现方式与OpenClaw使用pi-mono的Agent基础框架是一致的。了解完ReActAgent的基本原理,下一章我们会将一下SpringBoot集成方式的代码原理,这两章是我们构建后续内容的基本框架。

代码让AI扣 468

ESP32与DS18B20温度传感器的数据采集与告警系统

并且,通过自定义的微信告警功能,我们可以及时收到温度超过阈值的告警消息。随着物联网的快速发展,传感器在各种应用场景中发挥着重要的作用。本文将介绍如何使用ESP32微控制器与DS18B20温度传感器结合,通过串口输出和Web服务器实现温度数据的采集和监控,并使用自定义微信告警功能。上传完成后,打开串口监视器,您将看到ESP32连接到Wi-Fi网络,并开始监测温度。在您的计算机或移动设备上,打开一个Web浏览器,并输入ESP32的IP地址。在浏览器中输入ESP32的IP地址后,您将看到显示当前温度的页面。

loop_class349的博客 2242

RunTime.getRunTime().addShutdownHook用法

转载: http://blog.csdn.net/wgw335363240/archive/2010/08/31/5854402.aspx Runtime.getRuntime().addShutdownHook(shutdownHook);    这个方法的含义说明:     这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutd...

lgshendy的专栏 9797

Allegro174版本如何关闭模块复用后铜皮自动从动态变成静态操作指导

在用Allegro进行PCB设计的时候,模块复用是使用的十分频繁的操作,当Allegro升级到了174 S034版本的时候,当使用模块复用的功能的时候,模块内的铜皮会自动动静转换,大部分情况是不需要的。版本如何关闭模块复用后铜皮自动从动态变成静态操作指导。如何关闭这个功能,具体操作如下。

weixin_54787054的博客 1258

RunTime.getRunTime().addShutdownHook()用法

Runtime.getRuntime().addShutdownHook(shutdownHook);    这个方法的含义说明:      这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。

至道 2485

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Runtime.getRuntime().addShutdownHook使用

转载: http://blog.csdn.net/wgw335363240/archive/2010/08/31/5854402.aspx Runtime.getRuntime().addShutdownHook(shutdownHook);    这个方法的含义说明:     这个方法的意思就是在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addS

xiaozhu0301的博客 530

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Runtime.getRuntime().addShutdownHook()

解决 the application appears to have started a thread ... but failed to stop it,this is very likely to create a memory leak.这个警告 RunTime.getRunTime().addShutdownHook的作用就是在JVM销毁前执行的一个线程.当然这个线程依然要自己写. 有时候我们用到的程序不一定总是在JVM里面驻守,可能调用完就不用了,释放资源. 利用这个性质,如果我们之前定义.

请叫我大师兄 1523

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java:Runtime.getRuntime().addShutdownHook 捕获代码被结束时异常

问题描述: 代码有时候被杀掉,但是杀掉的时候需要去执行一些必要的操作,例如保存文件,java 提供了相应的方法 Runtime.getRuntime().addShutdownHook 。 1.贴一个例子 public class GetRunKill { public static void main(String[] args) { Runtime runtime =...

清泉影月 2160

Runtime.getRuntime().addShutdownHook

addShutdownHook()是一个终止处理的方法,这个方法会在Java执行环境全部结束时(调用System.exit方法时,或者所有非守护线程都结束时),调用指定线程的start方法(这时候该线程称为shutdown hook),使用该方法可以编写整个程序的终止处理。 示例1:public class AddShutdownHookTest { public static v

JessieLee_YoYo的专栏 2395

RunTime.getRunTime().addShutdownHook

看源码看到,Runtime.getRuntime().addShutdownHook(shutdownHook); google了一下它的含义:在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。所以这些钩子可以在jvm关闭的时候进行内存清理、对象销毁等操作。 ...

316

使用RunTime.getRunTime().addShutdownHook优雅关闭线程池

有时候我们用到的程序不一定总是在JVM里面驻守,可能调用完就不用了,释放资源. RunTime.getRunTime().addShutdownHook的作用就是在JVM销毁前执行的一个线程. 当然这个线程依然要自己写. 利用这个性质,如果我们之前定义了一系列的线程池供程序本身使用,那么就可以在这个最后执行的线程中把这些线程池优雅的关闭掉. 比如我们定义了一个线程池 privat...

悟鸣的技术博客 1221

Runtime.getRuntime().addShutdownHook 使用实例

今天看 14年 某个前辈留下的关于 JedisPool 的代码中用到了这个东西,但是不知道是干啥的,就查了一下 Runtime.addShutdownHook解释 如果你想在jvm关闭的时候进行内存清理、对象销毁等操作,或者仅仅想起个线程然后这个线程不会退出,你可以使用Runtime.addShutdownHook。 这个方法的作用就是在JVM中增加一个关闭的钩子。 当程序正常退出、系...

HeatDeath的博客 4001

runtime.getruntime().addshutdownhook

void java.lang.Runtime.addShutdownHook(Thread hook) 该方法用来在jvm中增加一个关闭的钩子。当程序正常退出,系统调用 System.exit方法或虚拟机被关闭时才会执行添加的shutdownHook线程。其中shutdownHook是一个已初始化但并不有启动的线程,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHoo

Iccmo的博客 823
上一篇: spuer和this关键字
下一篇: Java 读取 .properties
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值