前言
在多线程的应用中,Hook线程使用的相对较少,然而它依然是多线程中重要的一环,尤其是在释放资源这方面,有着举足轻重的作用,希望本文能解开你心中的疑惑,助你一臂之力!
一、Hook 线程介绍
1.1、作用
如果添加了Hook线程,则JVM程序即将退出的时候(收到了中断信号),Hook 线程在JVM主线程彻底退出之前,会被执行。
1.2、创建
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
...
//处理方法
}));
二、初识Hook线程
2.1、示例源码
package com.succ.thread.hook;
import java.util.concurrent.TimeUnit;
public class HookThreadDemo {
public static void creadHookThread(String threadName) {
Runtime.getRuntime().addShutdownHook(
new Thread(()->{
System.out.println("hook "+threadName+" is running");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("hook "+threadName+" will exit");
})
);
}
public static void main(String[] args) {
System.out.println("主线程 is running");
HookThreadDemo.creadHookThread("thread1");
HookThreadDemo.creadHookThread("thread2");
System.out.println("主线程 will exit");
}
}
2.2、效果展示
可以明显看到当主线程即将退出的时候,注入的两个 Hook 线程都被启动并打印相关日志。
三、Hook 线程的应用场景
1、Hook 线程中也可以执行一些关闭、删除、释放资源的操作,比如关闭数据库连接,Socket 连接等。
2、可以做一些校验,防止程序重复执行,以及修复工作。