彻底读懂用户线程和守护线程(代码详解)
【辰兮要努力】: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
- 点赞
- 收藏
- 关注作者
评论(0)