守护线程是什么?守护线程和非守护线程的区别是?守护线程的作用是?

本文深入解析守护线程的概念、作用及其与非守护线程的区别,通过示例代码演示如何设置守护线程,并阐述了守护线程在JVM中的重要角色,特别是对于后台任务如垃圾回收的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

守护线程是区别于用户线程,用户线程即我们手动创建的线程,守护线程是一种特殊类型的线程,它们服务于用户线程(非守护线程)。主要特点是:当JVM中没有任何非守护线程运行时,JVM将直接退出,而不会等待守护线程完成其执行。这种设计使得守护线程成为执行如垃圾收集(GC)、JVM内部监控等后台任务的理想选择。

    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("主线程执行完毕...");
    }

执行结果

可以发现标记为守护线程后,主线程销毁停止,守护线程一起销毁。我们再看下,去掉 t1.setDaemon(true)守护标记的效果:

所以,当主线程退出时,JVM 也跟着退出运行
此时:
非守护线程:当所有非守护线程都终止时,JVM才会退出。若存在非守护线程仍在运行,JVM将等待它们完成。
守护线程:JVM不会等待守护线程完成。只要没有非守护线程在运行,JVM将立即退出。

守护线程拥有自动结束自己生命周期的特性,非守护线程却没有。如果垃圾回收线程是非守护线程,当JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬。这就是为什么垃圾回收线程需要是守护线程

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值