默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;
/**
* 守护线程
*/
@Slf4j(topic = "c.DaemonThread")
public class DaemonThread {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
while (true) {
if (Thread.currentThread().isInterrupted()) {
break;
}
}
log.debug("结束");
}, "t");
// 设置该线程为守护线程
t.setDaemon(true);
t.start();
TimeUnit.SECONDS.sleep(1);
log.debug("主线程运行结束");
}
}
应用场景:
1.垃圾回收器线程就是一种守护线程
2.Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求