• 彻底读懂用户线程和守护线程(代码详解)


    【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行!

    博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、数据库、项目案例等相关知识点总结,感谢你的阅读和关注,希望我的博客能帮助到更多的人,分享获取新知,大家一起进步!

    吾等采石之人,应怀大教堂之心,愿我们奔赴在各自的热爱里…

    一、应用案例

    在上一篇 基于Redission的分布式锁实战 中给大家介绍了,一个看门狗看门狗就是负责来给redission对应的锁来进行续命的

    在这里插入图片描述

    Redisson 使用看门狗就是我们说的守护线程

    本篇就顺路整理相关知识点

    在这里插入图片描述

    Java提供了两种线程:守护线程和用户线程

    通过Thread.setDaemon(false)设置为用户线程
    
    通过Thread.setDaemon(true)设置为守护线程
    
    • 1
    • 2
    • 3

    如果不设置线程属性,那么默认为用户线程

    守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程都是守护线程。


    二、代码学习

    用户线程和守护线程的区别

    • 主线程结束后,用户线程还是会继续运行的,此时 JVM 是存活的
    • 如果没有用户线程,都是守护线程,那么 JVM 结束,则所有的线程都会结束
    用户线程

    在这里插入图片描述

    守护线程

    程序中通过 thread.setDaemon(true) 将 thread 线程设置为守护线程

    在这里插入图片描述

    用户线程测试验证代码

    /**
     * @author: 辰兮
     * @create: 2022-08-20 11:13
     */
    public class TestThread {
    
    
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread(() -> {
                while (true) {
                    try {
                        Thread.sleep(1000);
                        System.out.println("我是用户线程......");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
    
            Thread.sleep(3000);
            System.out.println("主线程执行完毕......");
    
            //测试效果:如果主线程结束,用户线程还会继续执行
        }
    
    }
    
    
    • 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

    守护线程测试验证代码

    /**
     * @author: 辰兮
     * @create: 2022-08-20 11:13
     */
    public class TestThread {
    
            public static void main(String[] args) throws InterruptedException {
                        Thread thread = new Thread(() -> {
                            while (true) {
                                try {
                                    Thread.sleep(1000);
                                    System.out.println("我是守护线程......");
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        });
                        // 设置为守护线程
                        thread.setDaemon(true);
                        thread.start();
    
                        Thread.sleep(3000);
                        System.out.println("主线程执行完毕......");
                        System.out.println("主线程执行完毕后守护线程不再执行......");
                    }
    
    }
    
    • 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
    实践案例

    使用Redis 的 SETNX 指令

    • 1.存在锁过期释放了,业务还没执行完。
    • 2.宕机可能导致锁的长期持有不释放等问题

    Redisson的看门狗【守护线程】帮我们解决了如上两个问题

    • 1.开启一个定时守护线程,每隔一段时间检查锁是否还存在,存在就自动对锁的过期时间延长,防止锁过期提前释放。
    • 2.当然如果程序宕机,看门狗守护线程自然挂掉,自然不会续命,所以锁到期会自动释放,不存在长期持有不释放的问题。

    📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤️ 分享👥 留言💬thanks!!!

    📚愿我们奔赴在各自的热爱里!

  • 相关阅读:
    [题] 改革春风吹满地 #图论 #多边形面积
    Python解析VOC数据标签文件
    【机器学习合集】泛化与正则化合集 ->(个人学习记录笔记)
    科技视界杂志科技视界杂志社科技视界编辑部2022年第18期目录
    一文带你拿捏分支和循环语句(一万字详细讲解)
    Http代理与socks5代理有何区别?如何选择?(二)
    数据类型与运算符-java
    electron 基础
    作为SiteGPT替代品,HelpLook的优势是什么?
    SpringCloud - Spring Cloud Netflix 之 Zuul网关;过滤器filter(十二)
  • 原文地址:https://blog.csdn.net/weixin_45393094/article/details/126437149