本博文主要是为了解释三个问题:
第一,什么是守护线程?
第二,为什么要有守护线程?
第三,何时需要守护线程?
1 什么是守护线程
public class DaemonThread {
private static int counter = 0;
public static void main(String[] args) throws InterruptedException {
// 创建子线程
Thread t1 = new Thread(() -> {
while (true) {
try {Thread.sleep(1000L);
System.out.println("子线程...");
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// t1.setDaemon(true); // 是否设置为守护线程
t1.start(); // 启动子线程
Thread.sleep(2000L);
// main 父线程结束
System.out.println("main thread finished lifecycle.");
}
}
上面的代码存在两个线程,一个是由 JVM 启动的 main 线程,另外一个则是我们自己创建的线程 Thread,运行上面的这段代码,你会发现 JVM 进程永远不会退出,即使 main 线程正常结束了自己的生命周期,原因就是因为在 JVM 进程中还存在一个非守护线程在运行。 如果打开是否设置为守护线程的注释,将自己创建的 Thread 设置为了守护线程,那么 main 进程结束生命周期后,JVM 也会随之退出运行,当然 Thread 线程也会结束。
2 守护线程的作用
为什么要?
如果一个 JVM 进程中没有一个非守护线程,那么 JVM 会退出,也就是说守护线程具备自动结束生命周期的特性,而非守护线程则不具备这个特点,试想一下如果 JVM 进程的垃圾回收线程是非守护线程,如果 main 线程完成了工作, JVM却无法退出,因为垃圾回收线程还在正常的工作。再比如有一个简单的游戏程序,其中有一个线程正在与服务器不断交互以获取玩家最新的信息,若希望在退出游戏客户端的时候,这些数据同步的工作也能够立即结束,这时候就需要一个守护线程了等等。
何时需要?
守护线程经常用作执行一些后台任务,因此有时它也被称为后台线程,当你希望关闭某些线程的时候,或者退出 JVM 进程的时候,一些线程能够自动关闭,此时就可以考虑用守护线程为你完成这样的工作。