守护线程是区别于用户线程,用户线程即我们手动创建的线程,守护线程是一种特殊类型的线程,它们服务于用户线程(非守护线程)。主要特点是:当JVM中没有任何非守护线程运行时,JVM将直接退出,而不会等待守护线程完成其执行。这种设计使得守护线程成为执行如垃圾收集(GC)、JVM内部监控等后台任务的理想选择。
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()-> {
while (true) {
try {
Thread.sleep(1000);
System.out.println("我是子线程(用户线程.I am running");
} catch (Exception e) {
}
}
});
//标记为守护线程
t1.setDaemon(true);
//启动线程
t1.start();
Thread.sleep(3000);
System.out.println("主线程执行完毕...");
}
执行结果

可以发现标记为守护线程后,主线程销毁停止,守护线程一起销毁。我们再看下,去掉 t1.setDaemon(true)守护标记的效果:

所以,当主线程退出时,JVM 也跟着退出运行
此时:
非守护线程:当所有非守护线程都终止时,JVM才会退出。若存在非守护线程仍在运行,JVM将等待它们完成。
守护线程:JVM不会等待守护线程完成。只要没有非守护线程在运行,JVM将立即退出。
守护线程拥有自动结束自己生命周期的特性,非守护线程却没有。如果垃圾回收线程是非守护线程,当JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬。这就是为什么垃圾回收线程需要是守护线程。