java-守护线程的三个为什么?

    科技2022-07-16  153

    本博文主要是为了解释三个问题:

    第一,什么是守护线程?

    第二,为什么要有守护线程?

    第三,何时需要守护线程?

    1 什么是守护线程

    public class DaemonThread { private static int counter = 0; public static void main(String[] args) throws InterruptedException { // 创建子线程 Thread t1 = new Thread(() -> { while (true) { try {Thread.sleep(1000L); System.out.println("子线程..."); } catch (InterruptedException e) { e.printStackTrace(); } } }); // t1.setDaemon(true); // 是否设置为守护线程 t1.start(); // 启动子线程 Thread.sleep(2000L); // main 父线程结束 System.out.println("main thread finished lifecycle."); } }

    上面的代码存在两个线程,一个是由 JVM 启动的 main 线程,另外一个则是我们自己创建的线程 Thread,运行上面的这段代码,你会发现 JVM 进程永远不会退出,即使 main 线程正常结束了自己的生命周期,原因就是因为在 JVM 进程中还存在一个非守护线程在运行。 如果打开是否设置为守护线程的注释,将自己创建的 Thread 设置为了守护线程,那么 main 进程结束生命周期后,JVM 也会随之退出运行,当然 Thread 线程也会结束。

    2 守护线程的作用

    为什么要?

    如果一个 JVM 进程中没有一个非守护线程,那么 JVM 会退出,也就是说守护线程具备自动结束生命周期的特性,而非守护线程则不具备这个特点,试想一下如果 JVM 进程的垃圾回收线程是非守护线程,如果 main 线程完成了工作, JVM却无法退出,因为垃圾回收线程还在正常的工作。再比如有一个简单的游戏程序,其中有一个线程正在与服务器不断交互以获取玩家最新的信息,若希望在退出游戏客户端的时候,这些数据同步的工作也能够立即结束,这时候就需要一个守护线程了等等。

    何时需要?

    守护线程经常用作执行一些后台任务,因此有时它也被称为后台线程,当你希望关闭某些线程的时候,或者退出 JVM 进程的时候,一些线程能够自动关闭,此时就可以考虑用守护线程为你完成这样的工作。

    Processed: 0.010, SQL: 8