java虚拟机钩子关闭函数addShutdownHook的操作
作者:lijie_cq 发布时间:2021-10-18 00:58:25
当jvm虚拟机被关闭的时候,可能我们需要做一些处理,比如对连接的关闭,或者对一些必要信息的存储等等操作,这里就可以借助于虚拟机提供的钩子函数,当jvm虚拟机关闭之前会去调用addShutdownHook注册的线程钩子。
这里做一个小实验,项目结构如下:
1.自定义的ApplicationContext的上下文
package cn.lijie;
public class ApplicationContext {
private static ApplicationContext application;
private void init() {
application = this;
Runtime.getRuntime().addShutdownHook(new MyShutdownHook());
}
public void close() {
System.out.println("钩子函数关闭连接操作");
}
public static ApplicationContext getApplication() {
return application;
}
}
2.定义一个钩子线程MyShutdownHook
package cn.lijie;
public class MyShutdownHook extends Thread {
public void run() {
System.out.println("钩子函数调用,准备关闭连接");
ApplicationContext.getApplication().close();
System.out.println("钩子函数调用,连接已经关闭");
}
}
3.spring容器的启动main
package cn.lijie;
public class ApplicationContext {
private static ApplicationContext application;
private void init() {
application = this;
Runtime.getRuntime().addShutdownHook(new MyShutdownHook());
}
public void close() {
System.out.println("钩子函数关闭连接操作");
}
public static ApplicationContext getApplication() {
return application;
}
}
4.application.xml
<bean name="application" class="cn.lijie.ApplicationContext" init-method="init" />
当执行main方法的时候创建spring容器,然后关闭,届时就会执行之前注册的钩子线程。
打印结果如下:
补充:JAVA虚拟机关闭钩子(Shutdown Hook)、finally(try,catch)、finalize()调用场景及执行顺序
JAVA虚拟机关闭钩子(Shutdown Hook)、finally(try,catch)、finalize(),三者都能在虚拟机关闭前做一些操作,但是调用场景和执行顺序不一样。
1. JAVA虚拟机关闭钩子(Shutdown Hook)在下面场景下被调用:
1) 程序正常退出;
2) 使用System.exit();
3) 终端使用Ctrl+C触发的中断;
4)系统关闭;
5)OutOfMemory宕机;
6) 使用Kill pid命令干掉进程(注:在使用kill -9 pid时,是不会被调用的);
2. finally(try...catch..)
当try里面的代码引起的错误导致虚拟机关闭前,执行finally;
3.finalize()方法
虚拟机垃圾回收过程中执行的方法;
4.三个方法的执行顺序
1) 从java的API文档介绍可得Shutdown Hook会在finalize()之前执行:
2)写了一个测试类测试finally和Shutdown Hook的执行顺序,可以看出finally在Shutdown Hook之前执行:
package Test;
public class ShutDownHookTest {
public static void main(String[] args) {
try {
new ShutDownHookTest().addShutdownHook();
String strs= "hello";
strs.charAt(8);
}catch(Exception e) {
e.printStackTrace();
}finally {
System.out.println("执行了finally!");
}
}
public void addShutdownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
System.out.println("执行了ShutdownHook!");
} catch (Throwable t) {
t.printStackTrace();
}
}
});
}
}
3)这三个方法的执行顺序:finally-》Shutdown Hook-》finalize()
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/qq_20641565/article/details/78624597
猜你喜欢
- 目录直播界面滑动隐藏效果用户交互页实现礼物进入时动画礼物移出动画开启定时清理礼物列表直播界面实现的是播放本地的视频文件:/** * 直播界面
- 我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘,就是我们 经常会在函数的参数里使用bool参数,这会大
- 绘制模糊数学中隶属函数分布图using System; using System.Collect
- 在这一系列教程的最后一篇中,我想谈谈GR的EventBus,在处理多线程异步任务时是多么简单而有效。AsyncTask, Loader和Ex
- 本文实例为大家分享了java实现简单俄罗斯方块的具体代码,供大家参考,具体内容如下结合网上的资料刚做完课程设计,具体代码如下:public
- Android 图片选择可以达到的效果:1.第一个图片的位置放照相机,点击打开照相机2.其余的是显示全部存储的图片,点击一次是查
- Java 实现 Http Server,模拟前端接口调用前言: 最近看到一个很有意思的东西,手写简单的 Http Server,而且只需要使
- 本文实例讲述了Java中的 * 、过滤器、 * 用法。分享给大家供大家参考,具体如下:一、 * :是在面向切面编程的就是在你的servic
- MDC介绍MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 、logback及log4j2 提供的
- 前文传送门:NioEventLoop处理IO事件执行任务队列继续回到NioEventLoop的run()方法:protected void
- 项目概况:Spring Cloud搭的微服务,使用了eureka,FeignClient,现在遇到FeignClient调用接口时不支持上传
- 前后端分离开发中,一般都会遇到请求跨域问题。而且一般也会遇到登陆失效问题。今天就以springboot和vue为例来看如何解决上述问题增加过
- 最近用到一些字符串加密,而.net中提供的加密算法中用起来比较复杂,便简单的封装了一下,方便日后使用。public class Encryp
- Spring中常见问题1.NoSuchBeanDefinitionException2.'..Service' that c
- 创建一个脚本,输入下面的代码。脚本不需要添加到任何物体上,globle变量可以跨场景全局调用。using System.Collection
- 本文运用图片给大家介绍了C#如何检查foreach判读其是否为null,我们下面话不多说,直接来看内容吧。1、foreach遍历列表或数组时
- vscode Java 开发环境配置博客地址VsCode官网教程系统需安装jdk1.8,配置好环境变量JAVA_HOME 打开vscode,
- 很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆。
- 自定义封装 banner 组件,供大家参考,具体内容如下1. 效果图预览 2.基本功能一个简单方便的轮播图组件,基于viewpag
- 前言说到 ADB 大家应该都不陌生,即 Android Debug Bridge,Android调试桥,身为 Android 开发的我们,熟