什么是用户线程?什么又是守护线程?
从名字上来看用户线程就是我们用户定义的线程,系统的工作线程用于完成一定的业务逻辑。而守护线程从名字上看我们可以理解为守护线程就是守护用户线程的比如我们常见的垃圾收集线程。守护线程在系统后台默默的提供着服务,一旦用户线程结束,那么Java虚拟机将会自动退出
举栗子:
public class Test extends Thread {
@Override
public void run() {
System.out.println(this.isDaemon()?"我是守护线程":"我是用户线程");
//定义一个死循环
while(true) {
;
}
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
test.start();
System.out.println("Main线程执行结束");
}
}
打印结果:
我们发现该程序并没有结束,因为我们定义的线程是一个用户线程,用户线程又是一个死循环导致程序不能推出。
再来一栗子:
public class Test extends Thread {
@Override
public void run() {
System.out.println(this.isDaemon()?"我是守护线程":"我是用户线程");
while(true) {
;
}
}
public static void main(String[] args) throws InterruptedException {
Test test = new Test();
test.setDaemon(true); //设置该线程为守护线程
test.start();
System.out.println("Main线程执行结束");
}
}
我们可以得出结论:用户线程执行结束后,无论守护线程是否结束,程序将自动结束。
注意:
我们要设置一个守护线程的话,一定要在启动线程之前设置。即setDaemon(true)方法要在start()方法之前执行!!!不然会报异常
守护线程的默认值:
public class Thread1 extends Thread {
@Override
public void run() {
System.out.println(this.getName()+(this.isDaemon()?"我是守护线程":"我是用户线程"));
Thread2 thread2 = new Thread2();
thread2.setName("t2线程");
thread2.start();
}
}
----------------------------------------------------------------------
public class Thread2 extends Thread {
@Override
public void run() {
System.out.println(this.getName()+(this.isDaemon()?"我是守护线程":"我是用户线程"));
}
}
测试类:
public class Test {
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
thread1.setName("t1线程");
thread1.setDaemon(true);
thread1.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//打印结果:
t1线程我是守护线程
t2线程我是守护线程
daemon默认值就是父类中的daemon值,就是说在一个线程中创建另一个线程的话,另一个线程默认daemon与当前线程一致。
Thread中创建线程的源码: