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

举报
辰兮 发表于 2022/08/20 22:48:53 2022/08/20
【摘要】 【辰兮要努力】:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端、后台、...

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

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

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

一、应用案例

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

在这里插入图片描述

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

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

在这里插入图片描述

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

通过Thread.setDaemon(false)设置为用户线程

通过Thread.setDaemon(true)设置为守护线程

  

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

守护线程是一种特殊的线程,在后台默默地完成一些系统性的服务,比如垃圾回收线程、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("主线程执行完毕......");

        //测试效果:如果主线程结束,用户线程还会继续执行
    }

}


  
 

守护线程测试验证代码

/**
 * @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("主线程执行完毕后守护线程不再执行......");
                }

}

  
 

实践案例

使用Redis 的 SETNX 指令

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

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

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

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

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

文章来源: blessing.blog.csdn.net,作者:辰兮要努力,版权归原作者所有,如需转载,请联系作者。

原文链接:blessing.blog.csdn.net/article/details/126437149

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。