1. 简述
守护线程
守护线程在主线程退出时候会随主线程一起结束,而不会阻塞主线程的退出
钩子线程
钩子线程可以在*JVM正常退出*的时候自动触发
2. 代码演示
public static void main(String[] args) throws InterruptedException {
// 线程钩子线程 在JVM正常退出时候触发,kill -9 等强制删除除外
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("【线程hook】线程结束Hook");
}));
// 守护线程,主线程执行完毕后,直接跟随结束
Thread thread = new Thread(() -> {
try {
while (true) {
System.out.println("守护线程支持执行");
TimeUnit.MILLISECONDS.sleep(500);
}
} catch (Exception e) {
e.printStackTrace();
}
});
// 设置为守护线程
thread.setDaemon(true);
thread.start();
TimeUnit.SECONDS.sleep(2);
}
3. 执行结果
3.1 设置为守护线程后,2秒后守护线程随着主线程结束关闭
执行结果如下:
守护线程支持执行
守护线程支持执行
守护线程支持执行
守护线程支持执行
【线程hook】线程结束Hook
3.2 将守护线程设置去除后,子线程会阻止主线程关闭
4. 结果分析
4.1 守护线程
守护线程执行中,随着Main线程执行结束,守护线程退出;
守护线程伴随Main线程结束后,JVM退出;
JVM退出触发Hook线程;