守护线程:java提供两种线程的概念,用户线程和守护线程。守护线程是为用户线程提供服务的。一旦用户线程被销毁,守护线程也同样会销毁。

守护线程的大量使用场景:启动微信后的多人聊天界面,如果直接关闭微信,那么这些不同的聊天界面对应的线程自然也会关闭。这些聊天界面 就是守护线程的案例。

守护线程的创建只是在线程的基础上额外的使用一个函数t1.setDeamon(true)

package com.ydlclass.thread;

/**
 * 守护线程的核心点为:守护线程不同于用户线程,守护线程是为用户线程提供服务的,一旦用户线程被终止,那么守护线程也就会被终止;
 * 下面的例子可以很好的说明守护线程与用户线程之间的关系;
 */
public class DefendThread {
    public static void main(String[] args) {
        Thread t1 = new Thread(()->{//注意此处的t1线程是由主线程创建的
            int count = 10;
            Thread t2 = new Thread(()->{//这个t2线程是由t1线程创建的,并且线程t2是守护线程;
                while (true){//守护线程每300ms打印一句话。
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("我是守护线程");
                }
            });
            //t2.setDaemon(true);
            t2.start();

            while (count >= 0){
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("我是用户线程!");
                count--;
            }
            System.out.println("用户线程结束---------");

        });
        //t1.setDaemon(true);//这样执行是一句话也不会被打印的:
        /**
         * 原因在于,t1为主线程的守护线程,主线程在执行创建t1线程这行的的代码之后,实际t1线程的创建时机主要是看cpu何时调度此;
         * 但是主线程会接着向下执行,并且设置t1线程为守护线程,然后启动线程;随后主线程结束,由于主线程一旦结束,那么守护线程
         * 同样会结束。t2线程也结束;所以最后一句话也没有打印就结束了。
         */
        t1.start();
        /**
         * 当t1不是守护线程时,那么就可以独自作为一个线程,此时main线程的结束不会影响线程。t1线程会打印10次会话,t2线程由于是t1线程的
         * 守护线程,所以t2线程同样会被结束。
         */

        /**
         * 当t2线程不是t1线程的守护线程时,t2线程就会一直独自的运行下去;每个300ms打印一次。
         */

    }
}