好记性不如赖笔头…………
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。
注意:
(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
(2) 在Daemon线程中产生的新线程也是Daemon的。
(3) 不要认为所有的应用都可以分配给Daemon来进行服务,比如读写操作或者计算逻辑。
API说明如下:
void setDaemon(boolean on) 标志着该线程是 守护线程或用户线程。
例子:
实体类:
package com.Ckinghan.threadEach;
public class Daemon extends Thread {
@Override
public void run() {
for(int i = 0; i < 500; i++){
System.out.println(this.getName()+"第"+(i+1)+"次执行");
}
}
}
测试类
package com.Ckinghan.threadEach;
public class DaemonDemo {
public static void main(String[] args) {
Daemon d1 = new Daemon();
Daemon d2 = new Daemon();
/**
* 将两个线程设置为守护线程
*/
d1.setDaemon(true);
d2.setDaemon(true);
d1.start();
d2.start();
for(int i = 0; i < 10; i ++){
System.out.println(Thread.currentThread().getName()+"主线程正在执行:"+i);
}
}
}
执行结果:
main主线程正在执行:0
Thread-1第1次执行
Thread-0第1次执行
Thread-1第2次执行
main主线程正在执行:1
Thread-1第3次执行
Thread-0第2次执行
Thread-0第3次执行
Thread-0第4次执行
Thread-0第5次执行
Thread-0第6次执行
Thread-0第7次执行
Thread-0第8次执行
Thread-0第9次执行
Thread-0第10次执行
Thread-0第11次执行
Thread-0第12次执行
Thread-0第13次执行
Thread-0第14次执行
Thread-0第15次执行
Thread-0第16次执行
Thread-0第17次执行
Thread-0第18次执行
Thread-0第19次执行
Thread-1第4次执行
main主线程正在执行:2
Thread-1第5次执行
Thread-0第20次执行
Thread-1第6次执行
main主线程正在执行:3
main主线程正在执行:4
main主线程正在执行:5
Thread-1第7次执行
Thread-0第21次执行
Thread-1第8次执行
main主线程正在执行:6
Thread-1第9次执行
Thread-0第22次执行
Thread-1第10次执行
main主线程正在执行:7
Thread-1第11次执行
Thread-0第23次执行
Thread-1第12次执行
main主线程正在执行:8
Thread-1第13次执行
Thread-0第24次执行
Thread-1第14次执行
main主线程正在执行:9
Thread-1第15次执行
Thread-1第16次执行
Thread-1第17次执行
Thread-1第18次执行
Thread-1第19次执行
Thread-1第20次执行
Thread-1第21次执行
Thread-1第22次执行
Thread-1第23次执行
Thread-1第24次执行
Thread-1第25次执行
Thread-1第26次执行
Thread-1第27次执行
Thread-1第28次执行
Thread-1第29次执行
Thread-1第30次执行
Thread-1第31次执行
Thread-1第32次执行
从上面的结果可以看出,当用户的线程结束之后,两个守护线程也随之结果,正常情况下,线程d1/d2每个都要循环输出500次,但它成了守护线程后,会随着用户线程的退出而终止。