Java 的守护线程

一 点睛

守护线程是一类比较特殊的线程,一般用于处理一些后台的工作,比如 JDK 的垃圾回收线程。什么是守护线程呢?

要回答这个问题,我们先搞清楚另外一个特别重要的问题:JVM 程序在什么情况下退出?

在正常情况下,若 JVM 中没有一个非守护线程,则 JVM 的进程会退出。

二 实战

1 代码

package concurrent;

public class DaemonThread {
    public static void main(String[] args) {
        // 1 main 线程开始
        Thread thread = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // 2 将 thread 设置为守护线程
        thread.setDaemon(true);
        // 3 启动 thrad 线程
        thread.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Main thread finished lifecycle");
        // main 线程结束
    }
}

2 分析

上面代码存在两个线程,一个是由 JVM 启动的 main 线程,另外一个是创建的 thread,如果将 thread.setDaemon(true); 注释掉,JVM 永远也不会退出,原因是 JVM 进程还存在一个非守护线程 thread;如果 thread.setDaemon(true); 不注释掉,也就是说通过 setDaemon 方法将 thread 设置为守护线程,那么当 main 进程结束了生命周期, JVM 也会随之退出运行,当然 thread 线程也会结束。

三 注意

设置守护线程的方法很简单,调用 setDaemon 方法即可,true 代表守护线程,false 代表正常线程。

线程是否为守护线程和它的父线程有很大的关系,子线程继承父线程的守护特性,如果想要修改它的特性,则可以借助 setDaemon 方法,isDaemon 方法可以判断该线程是不是守护线程。

另外需要注意,setDaemon 方法只在线程启动之前才能生效,如果一个线程已经死亡,那么再设置 setDaemon,则会抛出异常。

四 守护线程的作用

如果一个 JVM 进程中没有一个非守护线程,也就是说垃圾回收线程也是非守护线程,那么 main 线程正常退出后, JVM 无法退出,因为垃圾回收器还在正常工作。守护线程具备自动结束生命周期的特性。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值