默认情况下,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线程这些非守护线程的结束结束了。