什么是守护线程
守护线程是区别于用户线程,用户线程即我们手动创建的线程,而守护线程是程序运行的时候在后台提供一种通用服务的线程。
我用我自己的大白话概括:
为什么叫守护进程?守护的是什么?
守护的是创建这个线程的线程,所以创造者是被守护的对象。
那么被创建出来的守护线程是如何做到守护的呢?
守护线程拥有自动结束自己生命周期的特性,非守护线程却没有
eg:
守护线程:
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()-> {
while (true) {
try {
Thread.sleep(1000);
System.out.println("我是子线程(用户线程.I am running");
} catch (Exception e) {
}
}
});
//标记为守护线程
t1.setDaemon(true);
//启动线程
t1.start();
Thread.sleep(3000);
System.out.println("主线程执行完毕...");
}
可以发现标记为守护线程后,主线程销毁停止,守护线程一起销毁(自我销毁)。
eg:
非守护线程:
去掉 t1.setDaemon(true)守护标记的效果
所以,当主线程退出时,JVM 也跟着退出运行,守护线程同时也会被回收,即使是死循环。如果是用户线程,它会一直停在死循环跑。这就是守护线程和非守护线程的区别。
应用场景
通过上面的示例代码,相信你已经了解了守护线程和普通线程之间的区别,那么,我们来讨论一下为什么需要守护线程,以及何时使用,它的应用场景是什么?
上面,我们已经知道了,如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。
JVM 中的垃圾回收线程就是典型的守护线程,如果说不具备该特性,会发生什么呢?
当 JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬了!!!由此可见,守护线程的重要性了。
通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选。