• 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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    🚌🚌🚌
    我们没有使用设置 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();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    我们会发现,运行程序后,好像就程序直接结束了,然后在 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();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

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

  • 相关阅读:
    新疆旅游8日游费用以及详细线路,新疆八天七晚行程分享,看完就知道了
    UI自动化测试、接口测试等自动化测试
    003 PythonTCP网络通信
    博物馆预约小程序制作实战指南
    HCIA-Access V2.5华为认证接入网络工程师学习笔记第五章
    研究发现AI写的代码和人类一样也会有BUG
    Go微服务: 关于消息队列的选择和分类以及使用场景
    软件测试工程师 | 不拼学历,还能进大厂吗?
    Hadoop中的YARN组件
    (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • 原文地址:https://blog.csdn.net/m0_62547912/article/details/128153716