概念
Java线程分为守护线程和用户线程
守护线程,是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程
用户线程,是系统的工作线程,它会完成这个程序需要完成的业务操作
当程序中所有用户线程执行完毕之后,不管守护线程是否结束,系统都会自动退出。如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。
所以当系统只剩下守护线程的时候,Java虚拟机会自动退出
代码示例
开启一个线程a, 默认为用户线程,内部通过while循环使其无法结束。
当主线程(main)结束后,线程a仍然无法结束。
public class Daemon {
public static void main(String[] args) {
Thread a = new Thread(()->{
System.out.println(Thread.currentThread().getName()+" come in \t"+
(Thread.currentThread().isDaemon() ? "守护线程" : "用户线程"));
while (true){
}
},"a");
a.start();
//暂停几秒线程
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"\t"+"---task is over");
}
}
线程的daemon属性为true表示是守护线程,false(默认)表示是用户线程
设置daemon为ture,使得线程a为守护线程,此时当主线程(main)结束后,a也立即结束。
设置守护线程,需要在start()方法之前进行(否则会报错java.lang.IllegalThreadStateException)
public class Daemon {
public static void main(String[] args) {
Thread a = new Thread(()->{
System.out.println(Thread.currentThread().getName()+" come in \t"+
(Thread.currentThread().isDaemon() ? "守护线程" : "用户线程"));
while (true){
}
},"a");
a.setDaemon(true);
a.start();
//暂停几秒线程
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"\t"+"---task is over");
}
}