概念
线程分为守护线程和非守护线程。
守护线程是指在程序运行的时候在后台提供一种服务的线程,比如垃圾回收线程就是一个守护线程;当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止
守护线程和非守护线程不同之处在于JVM虚拟机的结束:如果非守护线程已经全部结束,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
使用方式
使用 thread.setDaemon可以把线程设置成守护线程,且必须在start之前,否则会跑出一个IllegalThreadStateException异常;
而且不能把正在运行的线程设置成守护线程
案例
非守护:
public class Daemon {
public static void main(String[] args) {
//非守护线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i =0 ; i< 10; i ++) {
System.out.println("用户线程"+i);
}
}
});
thread.start();
//主线程
for (int i =0 ; i< 5; i ++) {
System.out.println("主线线程"+i);
}
System.out.println("主线程执行完毕");
}
}
执行结果
![image.png](https://upload-images.jianshu.io/upload_images/17398468-d2eb6ac9834926b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
可以看出主线程结束了,非用户线程还在运行
守护线程:
public class Daemon {
public static void main(String[] args) {
//守护线程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i =0 ; i< 10; i ++) {
System.out.println("用户线程"+i);
}
}
});
thread.setDaemon(true);
thread.start();
//主线程
for (int i =0 ; i< 5; i ++) {
System.out.println("主线线程"+i);
}
System.out.println("主线程执行完毕");
}
}
执行结果
![image.png](https://upload-images.jianshu.io/upload_images/17398468-95950585672106a0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
看出主线程结束了,守护线程也结束了