默认情况下,Java进程需要等待所有线程都运行结束才会结束,有一种特殊的线程叫做守护线程,只要其他非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制结束
package cn.meowrain;
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;
@Slf4j
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
// 非守护线程t1
log.info("t1 start");
try {
// 模拟耗时
TimeUnit.SECONDS.sleep(1);
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
log.info("t1 end");
}
},"t1");
Thread t2 = new Thread(() -> {
// 非守护线程t1
log.info("t2 start");
try {
// 模拟耗时
TimeUnit.SECONDS.sleep(2);
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
log.info("t2 end");
}
},"t2");
Thread t3 = new Thread(()->{
try {
// 让这个守护线程运行时间久点儿
log.info("t3 start");
TimeUnit.SECONDS.sleep(5);
log.info("t3 end");
}catch (InterruptedException e) {
e.printStackTrace();
}
},"t3 daemon");
t1.start();
t2.start();
t3.setDaemon(true);
t3.start();
/**
* 上面的t1,t2和main都是非守护线程,
*/
}
}
从图中可以看到,线程3作为守护线程,还没结束输出t3 end就因为t1,t2和main线程这些非守护线程的结束结束了。