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

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

第一,什么是守护线程?

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

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

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 进程的时候,一些线程能够自动关闭,此时就可以考虑用守护线程为你完成这样的工作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值