默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。
简单写个样例,看看就明白了。
package com.bo.threadstudy.two;
import lombok.extern.slf4j.Slf4j;
/**
* 守护线程样例展示
*/
@Slf4j
public class DaemonThread {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.debug("thread1在执行");
}, "t1");
Thread t2 = new Thread(() -> {
while(true){
log.debug("t1的state"+t1.getState());
log.debug("thread2在执行");
}
}, "2");
//t2.setDaemon(true);
t1.start();
t2.start();
}
}
在注释掉t2.setDaemon(true)的情况下,发现t2是死循环,停不了。
而如果加上t2.setDaemon(true)的话,在t1结束后t2会停止。
守护线程是为了非守护线程所服务的线程,当非守护线程执行完成后,守护线程也就没什么用了,自己就会走向消亡。
注意
垃圾回收器线程就是一种守护线程
Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求