高并发编程-Runtime.getRuntime().addShutdownHook为自己的应用添加hook
文章目录
- 概述
- 使用场景
- 注意事项
- 示例
概述
一句话概括就是: ShutdownHook允许开发人员在JVM关闭时执行相关的代码。
我们可以使用java.lang.Runtime.getRuntime().addShutdownHook(Thread t)
方法在JVM中添加关闭钩子。
使用场景
1.程序正常退出 , JVM关闭
2. 调用System.exit ,JVM关闭
3. 程序抛出异常,导致JVM关闭
4. OOM 导致JVM关闭
5. 外界:Ctrl + C ,导致JVM关闭
6. 外界:用户注销或者关机,导致JVM关闭
7. 外界:kill 信号 (kill -9 除外)
8. …
注意事项
1. 可以使用addShutdownHook()添加多个shutdown hooks
2. Shutdown hooks 是initialized 但是 not-started的线程,当JVM关闭时被触发
3. 无法确定shutdown hooks的执行顺序,就像执行多线程一样。
4. 无法保证shutdown hooks会执行,例如系统崩溃,kill命令等。因此,应仅将其用于紧急情况下,例如确保释放关键资源等。不要执行耗时操作
5. 可以使用Runtime.getRuntime().removeShutdownHook(hook)方法删除钩子。
6. 启动关闭挂钩后,无法删除,否则抛出IllegalStateException。
7. 如果存在security manager并且它拒绝RuntimePermission(“shutdownHooks”),则将抛出SecurityException。
示例
package com.artisan.test;import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** Runtime.getRuntime().addShutdownHook Demo*/
public class FileHandler {public static String status = "STOPPED";public static String fileName = "";public static void main(String[] args) {// 添加HOOKRuntime.getRuntime().addShutdownHook(new FileHandlerHook());Runtime.getRuntime().addShutdownHook( new Thread(()->{System.out.println("HOOK TRIGGERED:多个shutdown hook 被触发...");}));// 文件目录String directory = "E:\\hooktest";File dir = new File(directory);// 列出txt结尾的文件File[] txtFiles = dir.listFiles(new FilenameFilter() {@Overridepublic boolean accept(File dir, String name) {if (name.endsWith(".txt")) {return true;} else {return false;}}});// 模拟触发Hook的情况 case 1//System.exit(0);// 模拟触发Hook的情况 case 2//int a = 1 / 0 ;他// OOM
// List list = new ArrayList();
// for(int i=0;i<Integer.MAX_VALUE;i++){// list.add(i+"测试oom 导出jvm退出,触发hook");
// }// 遍历数组 读取文件for (File file : txtFiles) {System.out.println("fileName:" + file.getName());status = "START";BufferedReader bufferedReader = null;try {FileReader fileReader = new FileReader(file);// BufferedReader一行行的读 提高读取效率bufferedReader = new BufferedReader(fileReader);String line;// 先读取一行line = bufferedReader.readLine();// 循环读取 直到读取完成while (line != null) {System.out.println(line);// 模拟业务 休眠一会 方便操作Thread.sleep(1_111);line = bufferedReader.readLine();}status = "PROCESSED";} catch (IOException | InterruptedException e) {status = "ERROR";e.printStackTrace();} finally {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}status = "FINISHED";}private static class FileHandlerHook extends Thread {@Overridepublic void run() {System.out.println("Status="+FileHandler.status);System.out.println("FileName="+FileHandler.fileName);if(!FileHandler.status.equals("FINISHED")){System.out.println("HOOK TRIGGERED:Seems some error, sending alert....");}else{System.out.println("HOOK TRIGGERED:handle file over , Do Something notify....");}}}
}
上述代码以及覆盖了使用场景中的事项 ,使用哪个来做验证,放开对应注释即可。
OOM的测试,请设置jvm参数 -Xms10m -Xmx10m
, 亲测有效,就不贴图了,自行验证即可。
高并发编程-Runtime.getRuntime().addShutdownHook为自己的应用添加hook相关推荐
- Java高并发编程:取消和关闭
Java没有提供任何机制来安全地终止线程,但是它提供了中断(Interruption).这是一种协作机制,能够使一个线程终止另一个线程当前的工作. 在对一个线程对象调用Thread.interrupt ...
- java线程高并发编程
java线程详解及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了,看看百度百科对他的评价,一点也不为过: 如果IT的历史,是 ...
- 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...
不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...
- Runtime.getRuntime().addShutdownHook(new Thread()
Runtime.getRuntime().addShutdownHook(new Thread() 2008-12-16 15:16 为您的Java应用程序添加退出事件处理 ------------- ...
- 高并发编程-重新认识Java内存模型(JMM)
文章目录 从CPU到内存模型 内存模型如何确保缓存一致性 并发变成需要解决的问题 (原子性.可见性.有序性) 内存模型需要解决的问题 Java内存模型 JMM的API实现 原子性 synchroniz ...
- 高并发编程-自定义简易的线程池(2),体会原理
文章目录 概述 示例 概述 高并发编程-自定义简易的线程池(1),体会原理 中只实现了任务队列,我们这里把其余的几个也补充进来 拒绝策略 关闭线程池 最小 最大 活动线程数 - 示例 比较简单,直接上 ...
- 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll
文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...
- 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析
文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...
- 高并发编程-Thread_正确关闭线程的三种方式
文章目录 概述 stop() Deprecated 方式一 设置开关 方式二 调用interrupt API 方式三 暴力结束线程-> Daemon Thread + interrupt API ...
最新文章
- 告别无止境的增删改查:Java代码生成器
- Java为啥不建议用通配符_为什么在Java导入语句中使用通配符不好?
- java 生产配置文件管理_JAVA基础——使用配置文件
- 江森系统设置服务器日期,江森自控METASYS操作手册
- App专项测试之弱网测试
- 机器学习——异常值检测
- 深度学习自学(三十五):双向图推理全景图像分割
- SCN和Checkpoint
- save与persist差别
- CentOS8桌面环境打开终端
- tomcate免安装版内存设置
- 区块链智能合约----Solidity状态修饰符view、pure
- 计算机硬盘合并怎么弄,如何将分区的硬盘合并为一个磁盘?
- 2019 TIP之ReID:Learning Modality-Specific Representations for Visible-Infrared Person Re-Identificati
- Thinksystem本地制作BOMC刷新SR650 升级到指定版本微码
- 交通行业大数据应用和发展现状
- 时间戳计算机网络,时间戳
- java 微信 摇一摇红包_微信小程序“摇一摇”的实例代码
- [Nikon D80]月季
- 思科网络安全 第四章考试答案
热门文章
- 学生成绩等级评定python_马鞍山市初中学生综合素质评价工作政策解读来了!
- c++ 新建一个数组
- pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换
- hardfault常见原因_XMC实验分享之四十八: Cortex M0的Hard Fault发生原因
- java contions_Java数据结构与算法
- 廖的python教程_学廖老师的python教程想到的
- 最长的可整合子数组的长度
- SparkSQL概述
- Adobe Auditon使用功能(一):将音频文件切分成多段,并将每段音频分别保存到不同的文件中
- MATLAB实战系列(四)- LabVIEW初探