用户线程和守护线程
用户线程(User Thread)
一般情况下不做特别说明配置,默认都是用户线程,是系统的工作线程,它会完成这个程序需要完成的业务员操作
isDaemon测试此线程是否为守护线程
通过Thread.setDaemon(false)设置为用户线程
public class DaemonDemo {
public static void main(String[] args) {
Thread t1 = new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
while (true){
}
},"t1");
t1.start();
System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
}
}
守护线程(Daemon Thread)
是一种特殊的线程为其它线程服务的,在后台默默地完成一些系统性的服务,比如垃圾回收线程就是最典型的例子。
守护线程作为一个服务线程,没有服务对象就没有必要继续运行了,如果用户线程全部结束了,意味着程序需要完成的业务操作已经结束了,系统可以退出了。所以假如当系统只剩下守护线程的时候,java虚拟机会自动退出。
通过Thread.setDaemon(true)设置为守护线程
import java.util.concurrent.TimeUnit;
public class DaemonDemo {
public static void main(String[] args) {
Thread t1 = new Thread(()->{
System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
while (true){
}
},"t1");
t1.setDaemon(true);
t1.start();
//暂停几秒线程
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"\t 开始运行,"
+(Thread.currentThread().isDaemon()?"守护线程":"用户线程"));
}
}
我们发现,程序已经推出了,因为t1是守护线程,当main线程(用户线程)结束后,系统只剩下守护线程,就自动退出了。
总结:
如果用户线程全部结束意味着程序需要完成的业务操作已经结束了,守护线程随着JVM一同结束工作
setDaemon(true)方法必须在start()之前设置,否则报legalThreadStateException异常