用户线程与守护线程
守护线程相对于用户线程而言是比较特殊的一类线程,通常自己创建的线程在不做任何处理之前都属于是用户线程。
而守护线程之所以称为守护线程,就是因为它的守护特性,怎么个守护法呢?守护线程是用来守护用户线程的,只有当JVM进程中,所有的用户线程执行完毕之后,守护线程才会和JVM进程一同结束。
简单而言,两者的主要区别就是线程的生命周期不同。
通过代码理解守护线程与用户线程
- 创建一个用户线程
- run方法写一个死循环,模拟用户线程不退出的情况
- 主线程执行完毕退出
public class TestDaemon implements Runnable {
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正在执行.....");
}
}
public static void main(String[] args) {
System.out.println("=====主线程开始执行=========");
TestDaemon test = new TestDaemon();
Thread thread = new Thread(test);
thread.start();
System.out.println("=====主线程结束执行=========");
}
}
输出结果:
可以看到程序一直在运行,虽然主线程已经执行完毕退出了。但是因为还有个用户线程一直在运行着,导致JVM进程无法退出。
将该线程设置为守护线程
public class TestDaemon implements Runnable {
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("正在执行.....");
}
}
public static void main(String[] args) {
System.out.println("=====主线程开始执行=========");
TestDaemon test = new TestDaemon();
Thread thread = new Thread(test);
thread.setDaemon(true);
thread.start();
System.out.println("=====主线程结束执行=========");
}
}
运行结果:
程序早早执行完了,这是因为这要当前JVM中所有的用户线程执行完毕,守护线程会随着JVM进程自动退出。
其中设置该线程为守护线程的setDaemon方法,必须在start方法之前调用,否则抛出异常。
守护线程的应用场景
通过前面的代码,可以看出守护线程拥有自己结束生命周期的特性,守护线程用于完成一些后台任务,典型的就是JVM的垃圾处理线程,及文档的自动保存等。