钩子作用:

在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。Java中得ShutdownHook提供了比较好的方案。
JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用:

触发条件:

  1. 程序正常退出
  2. 使用System.exit()
  3. 终端使用Ctrl+C触发的中断
  4. 系统关闭
  5. 使用Kill pid命令干掉进程

警告:在使用kill -9 pid是不会JVM注册的钩子不会被调用。

使用

方法:

Runtime.getRuntime().addShutdownHook(new CleanWorkThread());

示例:

package com.demo.rpc.hook;import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;public class TestShutdownHook {//简单模拟干活的static Timer timer = new Timer("job-timer");//计数干活次数static AtomicInteger count = new AtomicInteger(0);/*** hook线程*/static class CleanWorkThread extends Thread{@Overridepublic void run() {System.out.println("clean some work.");timer.cancel();try {Thread.sleep(2 * 1000);//sleep 2s} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) throws InterruptedException {//将hook线程添加到运行时环境中去Runtime.getRuntime().addShutdownHook(new CleanWorkThread());System.out.println("main class start ..... ");//简单模拟timer.schedule(new TimerTask() {@Overridepublic void run() {count.getAndIncrement();System.out.println("doing job " + count);if (count.get() == 10) {  //干了10次退出System.exit(0);}}}, 0, 2 * 1000);}
}

转载文章:https://www.cnblogs.com/nexiyi/p/java_add_ShutdownHook.html

java中钩子方法 addShutdownHook 学习使用相关推荐

  1. 2020年Java程序员不得不学习的10大技术

    对于Java开发人员来说,最近几年的时间中,Java生态诞生了很多东西.每6个月更新一次Java版本,以及发布很多流行的框架,如Spring 5.Spring Security 5和Spring Bo ...

  2. java培训分享:java培训架构师学习线路图

    本期java教程分享主要是讲解关于java培训架构师方面的内容,主要针对java架构师的学习线路图进行一个知识点的概括,下面来看看学习java架构师都需要了解哪些内容吧. java培训分享:java培 ...

  3. java培训分享:学习java开发的优势是什么

    想要进入到互联网行业的小伙伴,经常比较纠结学那个学科比较好,目前java.web前端.Python等都是非常热门的行业,前景也是比较好的,选择java学科的人比较多,那么学习java开发的优势是什么呢 ...

  4. java培训分享:学习Java需要什么软件

    在参加java培训过程中学习java技术,需要用到很多辅助工具,这些辅助工具是具有多功能性和实用性的,从代码构建到bug压缩.学习这些工具可以帮助您提高代码的质量,并成为一个更高效的Java开发人员. ...

  5. java开发培训好学习吗?难度大不大?

    ​ 互联网快速的发展,不断的在进行变革和更新,越来越多的人都对这个行业充满向往,很多人都想要学习java技术,那么java开发培训好学习吗?难度大不大?来看看下面的详细介绍. java开发培训好学习吗 ...

  6. 零基础参加java培训的系统学习路线

    ​ 零基础想要学习java技术,那么最好的选择就是参加java培训,进行系统的学习,以下就是小编为大家整理的零基础参加java培训的系统学习路线,希望能够帮助到正在学习java技术的零基础同学. 零基 ...

  7. 零基础java培训如何规划学习路线

    学习java的同学越来越多,很多小伙伴都想知道零基础如何学习java?如何安排学习路线,零基础java培训如何规划学习路线?那么针对以上问题,今天小编特意分享这篇Java学习指南,希望对那些想学Jav ...

  8. JAVA IO - RandomAccessFile Seek学习

    2019独角兽企业重金招聘Python工程师标准>>> JAVA IO - RandomAccessFile Seek学习 import java.io.RandomAccessFi ...

  9. java concurrent包的学习(转)

    java concurrent包的学习(转) http://my.oschina.net/adwangxiao/blog/110188 我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常 ...

最新文章

  1. 给Linux系统/网络管理员的nmap的29个实用例子
  2. 《Docker容器:利用Kubernetes、Flannel、Cockpit和Atomic构建和部署》——2.2 容器式Linux系统的Docker配置...
  3. 使用 Termux 查看连接到手机热点的ip地址
  4. 数据结构与算法详解目录
  5. Android布局文件的布局方式
  6. TypeScript,从0到入门带你进入类型的世界
  7. UDLD是一个Cisco私有的二层协议
  8. Jeecg入门篇,高手掠过
  9. Python更新数据库,解决转译字符与TypeError: XX format: a number is required, not str报错
  10. jsp+servlet+mysql简单实现用户登陆注册
  11. css光盘转动,CSS 实现加载动画之五-光盘旋转
  12. 关于webstorm 弹出Clear Read-Only status
  13. Access导入Sql 2008 R2 错误 0xc020801c
  14. CM源码(CyanogenMod)源码编译
  15. IAR 设置TAB代码格式问题
  16. centos7升级GLIBC版本
  17. 飞思卡尔16位单片机(十四)—— CAN总线模块测试
  18. android 手势识别,Android实现Gesture手势识别用法分析
  19. 不止会下棋,人工智能还能高考阅卷
  20. 启明医疗完成对一家脑保护装置生产商的收购

热门文章

  1. 跨模块中的分配内存问题
  2. 协议簇:ICMP 解析
  3. 汇编语言笔记(一):基础
  4. 个人和结对项目 - 英语单词词频统计
  5. Linux如何查看所有用户和用户组信息(cat groups whoami)
  6. 宋浩 概率统计 笔记_推论统计分析学习笔记
  7. html5 webrtc fir 请求关键帧_中信建投官网强调认可我们的投资理念的股民朋友请求 CTRL D 收藏、锁定本直播地址...
  8. java如何添加自定义的图片_java代码将图片加上自定义水印 -4
  9. html列表滑动字母索引,js实现做通讯录的索引滑动显示效果和滑动显示锚点效果...
  10. 前端websocket获取数据后需要存本地吗_是什么让我放弃了Restful API?了解清楚后我全面拥抱GraphQL!...