• 四、守护线程 deamon


    四、守护线程 deamon

    • 线程分为 User Thread(用户线程)Daemon Thread(守护线程)
    • 虚拟机必须确保用户线程执行完毕
    • 虚拟机不用等待守护线程执行完毕
    • 如:后台记录操作日志、监控內存、垃圾回收等
    • 操作
      • 通过 thread.setDaemon(true) 将线程转换为守护线程,这个方法必须在 thread.start()之前进行调用

    1、守护线程简介(摘自)

    守护线程的功能非常简单,在其本身是一个线程的同时,主要是为了给其他的线程提供服务,比如说计时器,清空高速缓存等等操作,守护线程具有和被守护线程一样的生命周期(这里并不是说守护线程和被守护线程常常是1对1的关系),当被守护线程死亡,守护线程往往也会死亡,当虚拟机中只剩下守护线程时,虚拟机就会退出,因为此时也没有运行程序的必要了

    一个比较通俗的解释:任何一个守护线程都是整个JVM中所有非守护线程的保姆

    只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
    守护线程的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者


    2、需要注意的点

    • 守护线程的优先级比较低
    • 守护线程要注意考虑关机动作
    • 守护线程应该永远不去访问固有资源,比如说文件或者数据库,因为它会在任何时候甚至一个操作的中间发生中断
    • 不要给守护线程分担读写逻辑或者计算逻辑,因为无法确定守护线程是否已经完成了工作,但是只要User退出守护线程也会立马结束,对于计算机程序来说这样的程序可能多次运行结果不一样,很显然这对于程序来说是毁灭性的

    3、CODE

    package mii.thread.demo12守护线程;
    public class TestDeamon02 {
    
        public static void main(String[] args) {
            // 守护线程
            Thread deamonThread = new Thread(()->{
                for (;;){
                    System.out.println(Thread.currentThread().getName() + 
                                       "__在幕后默默守护着...");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, "守护线程");
    
            // 用户线程
            Thread userThread = new Thread(()->{
                int age = 0;
                while (age < 100) {
                    age++;
                    System.out.println(Thread.currentThread().getName() + 
                                       "__已经" + age + "岁了,正在努力奋斗!");
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName() + "__挂了!");
            }, "小明");
    
            deamonThread.setDaemon(true); // 默认false
            deamonThread.start();
            userThread.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    4、Result

    在这里插入图片描述

  • 相关阅读:
    Linux 操作系统的Apache和MySql自动启动方法
    安全浏览器是否可以直接“回击”浏览器主页劫持?
    批量从bam文件获取指定位置的碱基
    机器学习之逻辑回归以及梯度下降法求解
    关键点检测 HRNet网络详解笔记
    wifi分销大师小程序v4.0.5独立版saas系统源码+前端
    力扣日记11.7-【二叉树篇】二叉树的层序遍历
    基础—SQL—DQL(数据查询语言)分页查询
    显示屏没有信号monitor no signal from device
    SBT 运行出现 module java.base does not “opens java.lang“ to unnamed module错误
  • 原文地址:https://blog.csdn.net/qq_30769437/article/details/126438886