守护线程是一类比较特殊的线程,一般用于处理一些后台的工作,比如 JDK 的垃圾回收线程。什么是守护线程呢?
要回答这个问题,我们先搞清楚另外一个特别重要的问题:JVM 程序在什么情况下退出?
在正常情况下,若 JVM 中没有一个非守护线程,则 JVM 的进程会退出。
package concurrent;
public class DaemonThread {
public static void main(String[] args) {
// 1 main 线程开始
Thread thread = new Thread(() -> {
while (true) {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 2 将 thread 设置为守护线程
thread.setDaemon(true);
// 3 启动 thrad 线程
thread.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main thread finished lifecycle");
// main 线程结束
}
}
上面代码存在两个线程,一个是由 JVM 启动的 main 线程,另外一个是创建的 thread,如果将 thread.setDaemon(true); 注释掉,JVM 永远也不会退出,原因是 JVM 进程还存在一个非守护线程 thread;如果 thread.setDaemon(true); 不注释掉,也就是说通过 setDaemon 方法将 thread 设置为守护线程,那么当 main 进程结束了生命周期, JVM 也会随之退出运行,当然 thread 线程也会结束。
设置守护线程的方法很简单,调用 setDaemon 方法即可,true 代表守护线程,false 代表正常线程。
线程是否为守护线程和它的父线程有很大的关系,子线程继承父线程的守护特性,如果想要修改它的特性,则可以借助 setDaemon 方法,isDaemon 方法可以判断该线程是不是守护线程。
另外需要注意,setDaemon 方法只在线程启动之前才能生效,如果一个线程已经死亡,那么再设置 setDaemon,则会抛出异常。
如果一个 JVM 进程中没有一个非守护线程,也就是说垃圾回收线程也是非守护线程,那么 main 线程正常退出后, JVM 无法退出,因为垃圾回收器还在正常工作。守护线程具备自动结束生命周期的特性。
守护线程经常会执行一些后台任务,因此有时它也被称为后台线程,当你希望关闭某个线程的时候,或者退出 JVM 进程的时候,一些线程能够自动关闭,此时就可以考虑用守护线程为你完成这样的工作。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/122892512
内容来源于网络,如有侵权,请联系作者删除!