默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。
有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束。 守护别人,别的非守护线程做完了,我不管三七二十一都结束了。
t1不是守护线程的情况下,main线程结束了,t1还没有结束,一直在空转,所以jvm进程便不会结束.
package com.jxz.hm_juc;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DaemonTest {
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(()->{
while(true){
if(Thread.currentThread().isInterrupted()) break;
}
log.debug("t1线程结束");
},"daemon");
// t1.setDaemon(true);
t1.start();
Thread.sleep(1000);
log.debug("main线程结束");
}
}
输出:
如果t1是守护线程,main线程结束了,t1也跟着一起结束,jvm中的线程全部结束,因此程序退出。
package com.jxz.hm_juc;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DaemonTest {
public static void main(String[] args) throws InterruptedException {
Thread t1=new Thread(()->{
while(true){
if(Thread.currentThread().isInterrupted()) break;
}
log.debug("t1线程结束");
},"daemon");
t1.setDaemon(true);
t1.start();
Thread.sleep(1000);
log.debug("main线程结束");
}
}
输出:
注意
- 垃圾回收器线程就是一种守护线程
- Tomcat 中的 Acceptor 和 Poller 线程都是守护线程,所以 Tomcat 接收到 shutdown 命令后,不会等待它们处理完当前请求