Hook线程

  • Hook线程
    • Hook介绍
    • Hook创建
    • Hook实例
    • Hook应用

Hook线程

Hook线程,通常也被成为钩子。

Hook介绍

JVm进程退出是由于JVM进程中没有活跃的非守护线程,或者收到了系统中断信号,向JVM程序注入一个Hook线程,在JVM进程退出的时候,Hook线程会启动执行,通过Runtime可以为JVM注入多个Hook线程。

Hook创建

Runtime.getRuntime().addShutdownHook(new Thread(() -> {...//处理方法
}));

当方法运行结束之后,也就是jvm进程退出的时候,Hook线程,就会执行,当然如果有多个Hook线程,运行的是无序的。

Hook实例


import java.util.concurrent.TimeUnit;/*** @Author: zcl* @Date: 2022-01-29 10:19*/
public class HookThread {public static void main(String[] args) {createHook();System.out.println("The main process is over!");}public static void createHook() {Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("This is a hook thread:" + Thread.currentThread().getName());try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("This is a hook exit" + Thread.currentThread().getName());}, "Thread-Hook-1"));Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("This is a hook thread:" + Thread.currentThread().getName());try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("This is a hook exit" + Thread.currentThread().getName());}, "Thread-Hook-2"));}}

运行结果如下:

The main process is over!
This is a hook thread:Thread-Hook-1
This is a hook thread:Thread-Hook-2
This is a hook exitThread-Hook-2
This is a hook exitThread-Hook-1

通过运行结果可以看出,hook线程运行是交替运行,也就是并行状态的。同时也是当主线程运行结束之后,才会调用,可以通过打上断点测试下。

Hook应用

开发中遇到的hook线程,比如为了防止某个程序被重复启动, 在进程启动时创建一个lock文件,进程收到中断信号之后删除这个文件。也可以执行一些资源释放的工作,比如关闭文件句柄、socket链接、数据库connection等。

注意点:

  1. Hook线程只有在收到退出信号的时候会被执行,如果在kill的时候使用了参数 -9,那么Hook线程不会得到执行,进程将立即退出,强制结束。
  2. 尽量不要在Hook线程中执行一些耗时非常长的操作,因为会导致程序迟迟不能退出。

学习自:
《Java高并发编程详解——多线程与架构设计》 汪文君

并发编程——Hook线程相关推荐

  1. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

  2. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  3. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自 Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mul ...

  4. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  5. 并发编程-13线程安全策略之两种类型的同步容器

    文章目录 脑图 概述 同步容器 集合接口下的同步容器实现类 Vector (线程安全性比ArrayList好一些,但并非绝对线程安全) 同步容器 线程不安全的场景 其他注意事项 Hashtable C ...

  6. 并发编程-12线程安全策略之常见的线程不安全类

    文章目录 脑图 概述 字符串拼接子之StringBuilder.StringBuffer StringBuilder (线程不安全) StringBuffer (线程安全) 小结 时间相关的类 Sim ...

  7. 并发编程-11线程安全策略之线程封闭

    文章目录 脑图 概述 线程封闭的三种方式 示例 堆栈封闭 ThreadLocal Step1. ThreadLocal操作类 Step2. 自定义过滤器 Step3. 注册拦截器,配置拦截规则 Ste ...

  8. 并发编程-06线程安全性之可见性 (synchronized + volatile)

    文章目录 线程安全性文章索引 脑图 可见性定义 导致不可见的原因 可见性 -synchronized (既保证原子性又保证可见性) 可见性 - volatile(但不保证操作的原子性) volatil ...

  9. 并发编程-05线程安全性之原子性【锁之synchronized】

    文章目录 线程安全性文章索引 脑图 概述 原子性synchronized 修饰的4种对象 修饰代码块 作用范围及作用对象 Demo 多线程下 同一对象的调用 多线程下不同对象的调用 修饰方法 作用范围 ...

最新文章

  1. 【NIO】缓存区buffer
  2. java与scala的区别 个位数以内的 就喜欢作者这么言简意赅的
  3. 关于Unity调用摄像头扫描二维码与生成二维码的实现方法
  4. mysql中的触发器
  5. 后台开发经典书籍--图解http
  6. 【技术综述】图像与CNN发家简史,集齐深度学习三巨头
  7. 150个Java面试问答-最终清单(PDF下载)
  8. 虚拟机ip地址怎么设置
  9. python熊猫图案_熊猫Python数据分析库和SQL教会了我如何取平均数
  10. 简单编写图书管理系统
  11. java魔剑天使_大天使之剑大神教你打造牛逼魔剑士
  12. python装饰器原理wraps(method)(self)_理解Python中装饰器最佳方法~
  13. 树莓派连接笔记本当外接显示屏使用
  14. 到月宫上挖土-嫦娥五号背后的航天系统工程
  15. 蓝月传奇服务器例行维护,《蓝月传奇》7月14日更新维护公告
  16. 如何在项目中使用ECharts
  17. Java基础知识小练习合集
  18. MYSQL安装出现问题(服务无法启动,The service already exists)
  19. 麒麟操作系统根目录权限777修复方法
  20. 数据结构(七)——Dijkasta 、Flyod、马踏棋盘算法

热门文章

  1. win7修改默认锁屏背景
  2. 新手怎么选择蓝牙耳机不被忽悠?注意这两大误区一定不猜雷
  3. 60个平移过渡预设PR合集
  4. 悲剧的与幽默的人生态度——宗白华
  5. Android开发-安卓手机真机调试配置教程(以小米/红米手机为例)
  6. 怎样利用博客推广自己的网店?
  7. 前端和Java,学哪个好?
  8. 如何快速开发实用的应用软件?
  9. php 干扰曲线,曲线干扰控制
  10. 3万字BI系统整体建设解决方案