守护线程

main线程是用户线程;只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。

守护线程是在用户线程都退出时,突然退出的,此时守护线程的任务不一定完成了。

public class rrr {
    public static void main(String[] ddd){
        FutureTimeOutThread timeOutThread = new FutureTimeOutThread();
        timeOutThread.setDaemon(true);//守护线程, 
        timeOutThread.start();
        
        FutureTimeOutThread2 timeOutThread1 = new FutureTimeOutThread2();
        timeOutThread1.setDaemon(false);// 不是守护
        timeOutThread1.start();
        
        System.out.println("2222");
    }
    static class FutureTimeOutThread extends Thread{//守护
        @Override
        public void run() {
            FutureTimeOutThread1 timeOutThread = new FutureTimeOutThread1();
            timeOutThread.start();
            for(int i =0;i<3;i++) {//外层线程退出,里面开的线程不会退出,只有非守护都退出才退出
                System.out.println("1111");
            }
        }
    }
    static  class FutureTimeOutThread1 extends Thread{//默认也是守护
            @Override
            public void run() {
                for(int i =0;i<3;i++) {
                    System.out.println("222");
                }
            }
        }
    static  class FutureTimeOutThread2 extends Thread{//不是守护
            @Override
            public void run() {//main线程执行完,只要这个非守护线程还在,守护就还在。
                //main执行完,这个非守护可以一直执行。
                //main和这个非守护都执行完,守护立马退出。
                //守护都执行完,这个非守护不会退出
                for(int i =0;i<3;i++) {
                    System.out.println("333");
                }
            }
        }
}
原文地址:https://www.cnblogs.com/yaowen/p/10695440.html