文章目录

  • 概述
  • 使用场景
  • 注意事项
  • 示例

概述

一句话概括就是: 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相关推荐

  1. Java高并发编程:取消和关闭

    Java没有提供任何机制来安全地终止线程,但是它提供了中断(Interruption).这是一种协作机制,能够使一个线程终止另一个线程当前的工作. 在对一个线程对象调用Thread.interrupt ...

  2. java线程高并发编程

    java线程详解及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了,看看百度百科对他的评价,一点也不为过: 如果IT的历史,是 ...

  3. 高并发编程_高并发编程系列:7大并发容器详解(附面试题和企业编程指南)...

    不知道从什么时候起,在Java编程中,经常听到Java集合类,同步容器.并发容器,高并发编程成为当下程序员需要去了解掌握的技术之一,那么他们有哪些具体分类,以及各自之间的区别和优劣呢? 只有把这些梳理 ...

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

    Runtime.getRuntime().addShutdownHook(new Thread() 2008-12-16 15:16 为您的Java应用程序添加退出事件处理 ------------- ...

  5. 高并发编程-重新认识Java内存模型(JMM)

    文章目录 从CPU到内存模型 内存模型如何确保缓存一致性 并发变成需要解决的问题 (原子性.可见性.有序性) 内存模型需要解决的问题 Java内存模型 JMM的API实现 原子性 synchroniz ...

  6. 高并发编程-自定义简易的线程池(2),体会原理

    文章目录 概述 示例 概述 高并发编程-自定义简易的线程池(1),体会原理 中只实现了任务队列,我们这里把其余的几个也补充进来 拒绝策略 关闭线程池 最小 最大 活动线程数 - 示例 比较简单,直接上 ...

  7. 高并发编程-使用wait和notifyAll进行线程间的通信3_多线程下的生产者消费者模型和notifyAll

    文章目录 概述 解决办法 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析 中分析了假死的原因,这里我们来看下改如何解决在多线程下出现的这 ...

  8. 高并发编程-线程通信_使用wait和notify进行线程间的通信2_多生产者多消费者导致程序假死原因分析

    文章目录 概述 jstack或者可视化工具检测是否死锁(没有) 原因分析 概述 高并发编程-线程通信_使用wait和notify进行线程间的通信 - 遗留问题 我们看到了 应用卡住了 .... 怀疑是 ...

  9. 高并发编程-Thread_正确关闭线程的三种方式

    文章目录 概述 stop() Deprecated 方式一 设置开关 方式二 调用interrupt API 方式三 暴力结束线程-> Daemon Thread + interrupt API ...

最新文章

  1. 告别无止境的增删改查:Java代码生成器
  2. Java为啥不建议用通配符_为什么在Java导入语句中使用通配符不好?
  3. java 生产配置文件管理_JAVA基础——使用配置文件
  4. 江森系统设置服务器日期,江森自控METASYS操作手册
  5. App专项测试之弱网测试
  6. 机器学习——异常值检测
  7. 深度学习自学(三十五):双向图推理全景图像分割
  8. SCN和Checkpoint
  9. save与persist差别
  10. CentOS8桌面环境打开终端
  11. tomcate免安装版内存设置
  12. 区块链智能合约----Solidity状态修饰符view、pure
  13. 计算机硬盘合并怎么弄,如何将分区的硬盘合并为一个磁盘?
  14. 2019 TIP之ReID:Learning Modality-Specific Representations for Visible-Infrared Person Re-Identificati
  15. Thinksystem本地制作BOMC刷新SR650 升级到指定版本微码
  16. 交通行业大数据应用和发展现状
  17. 时间戳计算机网络,时间戳
  18. java 微信 摇一摇红包_微信小程序“摇一摇”的实例代码
  19. [Nikon D80]月季
  20. 思科网络安全 第四章考试答案

热门文章

  1. 学生成绩等级评定python_马鞍山市初中学生综合素质评价工作政策解读来了!
  2. c++ 新建一个数组
  3. pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换
  4. hardfault常见原因_XMC实验分享之四十八: Cortex M0的Hard Fault发生原因
  5. java contions_Java数据结构与算法
  6. 廖的python教程_学廖老师的python教程想到的
  7. 最长的可整合子数组的长度
  8. SparkSQL概述
  9. Adobe Auditon使用功能(一):将音频文件切分成多段,并将每段音频分别保存到不同的文件中
  10. MATLAB实战系列(四)- LabVIEW初探