守护线程是一类比较特殊的线程,一般用于处理后台的工作,比如JDK的垃圾回收线程。
守护线程具备自动结束生命周期的特点,非守护线程不具备这样的特点
首先明确一个问题:JVM什么情况下会退出?
The java virtual machine exits when the only thread running are all daemon thread.当运行的唯一线程是守护线程时,java虚拟机退出。
例如其他线程都执行结束,只剩一个垃圾回收线程了,JVM就会退出。
为什么要用守护线程呢?
举个例子:当你用微信和男朋友视频聊天的时候,突然生气了,直接关闭微信程序,视频聊天线程还会一直执行吗?显然不会。那如何满足这个需求?设置视频聊天线程为守护线程。
public class TestDemo3 {
public static void main(String[] args) {
//匿名线程
Thread thread = new Thread(){
@Override
public void run() {
while(true){
try {
System.out.println("视频聊天线程执行");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread.start();
try {
System.out.println("微信主线程执行");
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//main线程结束
System.out.println("主线程结束");
}
}
运行结果
当主线程结束,没有Process finished with exit code 0提示,说明JVM并没有退出。视频聊天线程还一直在执行。这显然不是我们所期待的。
我们应该根据守护线程具备自动结束生命周期的特点,设置视频聊天线程为守护线程,当微信进程结束视频聊天进程也应该结束才对。
如何设置线程为守护线程?
线程名.setDaemon(true);方法
注意:setDaemon方法只能线程启动之前使用,如果对于一个线程已经死亡或者未启动,那么设置setDaemon会抛出IllegalThreadStateException异常。
public class TestDemo3 {
public static void main(String[] args) {
//匿名线程
Thread thread = new Thread(){
@Override
public void run() {
while(true){
try {
System.out.println("视频聊天线程执行");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
//线程启动之前设置thread为守护线程
thread.setDaemon(true);
thread.start();
try {
System.out.println("微信主线程执行");
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//main线程结束
System.out.println("主线程结束");
}
}
运行结果
主线程结束,视频聊天线程也相应的结束。JVM进程退出。