Java && 守护线程

✨✨hello,愿意点进来的小伙伴们,你们好呐!
🐻🐻系列专栏:【JavaEE初阶】
🐲🐲本篇内容:详解守护线程
🐯🐯作者简介:一名现大二的三非编程小白,日复一日,仍需努力。

Daemon 线程 介绍:

Daemon 线程 就是 我们经常听说到的 守护线程
🚗🚗🚗
该Daemon 线程 是一个支持型的线程 , 可以理解为Daemon 线程 支持了Java程序进程的后台调度, 只要在 程序中只存在Daemon 线程 执行,那么该程序就会退出程序,并销毁进程

🚓🚓🚓
相反的是当一个程序存在非Daemon 线程 时,那么这个程序就会等待非Daemon 线程 执行结束后再销毁进程

Daemon 线程的 构造:

🚕🚕🚕
Daemon 线程 是我们在创建线程的时候设置的,只有在启动线程之前设置,无法在启动线程后设置

Daemon 线程 是通过 setDaemon(true) 方法来设置的

在这里插入图片描述

演示 Daemon 线程 :

🚙🚙🚙
接下来我们来看看守护线程与非守护线程的区别

先来看看非守护线程:

public class ThreadDemo26 {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("设置守护线程");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Daemon");
/*        thread.setDaemon(true);*/
        thread.start();
    }
}

🚌🚌🚌
我们没有使用设置 Daemon 线程的方法,这个时候线程的运行就会发现,输出正常输出,且使用 jconsole 工具也可以看得到进程与线程正在执行
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
那这个时候除了我们创建的线程外为什么还有那么多线程呢?

其实这些线程都是JVM自带的线程,当一个进程创建的时候,就会有这些线程的创建,随着进程的执行结束,这些线程就随着销毁,由此可见,这些由JVM自带的线程都是 Daemon线程,不会影响进程的结束

在这里插入图片描述

🚐🚐🚐
接下来我们来`设置Daemon线程来观察一下会发生哪些变化

public class ThreadDemo26 {
    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("设置守护线程");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "Daemon");
        thread.setDaemon(true);
        thread.start();
    }

}

我们会发现,运行程序后,好像就程序直接结束了,然后在 jconsole 工具也找不到进程了
其实这个时候,在main线程中调用了Daemon线程,然后main线程结束后,Daemon线程又是守护线程,那么这个时候Daemon线程不会阻止进程的结束执行,所以进程就结束了,相对着,Daemon线程也是销毁的

🚎🚎🚎
Daemon线程随之main线程的执行完毕而终止
在这里插入图片描述
在这里插入图片描述

Daemon 线程 注意事项:

🚒🚒🚒
构建 Daemon线程还需要注意一点:
不能依靠finally块来做释放资源的操作;

public class ThreadDemo26 {
    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            for (int i = 0; i < 100; i++) {
                System.out.println("设置守护线程");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }finally {
                    System.out.println("Daemon线程执行 finally");
                }
            }
        }, "Daemon");
        thread.setDaemon(true);
        thread.start();
    }

}

执行结果我们可以看到,程序并不会执行到finally块中的内容,所以我们在这里要慎重使用
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无满*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值