守护线程: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打印一次。
*/
}
}