什么是守护线程?Redis守护线程如何开启?
守护线程
1. 守护线程 与 用户线程的概念
Java中的线程分为用户线程与守护线程
用户线程
我们正常通过继承Thread或者实现Runnable/Callable类以及线程池创建的线程均为用户线程, 也就是普通线程.
守护线程
守护线程是为用户线程服务的, 它也被称为后台线程或服务线程.当程序中的用户线程全部执行结束之后, 守护线程也会跟随结束.(所以当一个程序里的全部用户线程都执行结束之后, 无论守护线程是否还在工作, 都会跟随用户线程一块结束, 整个程序也会随之结束)
2. 设置守护线程的方式:
2.1 非线程池设置
非线程池设置,通过 Thread.setDaemon(true) 方法将线程设置为守护线程
Thread.setDaemon() 方法的注释,如下所示。**
Marks this thread as either a daemon thread or a user thread.
将此线程标记为守护线程或用户线程。
1. The Java Virtual Machine exits when the only threads running are all daemon threads.
当唯一运行的线程都是守护线程时,Java 虚拟机退出。
2. This method must be invoked before the thread is started.
此方法必须在线程启动之前调用。
//1.定义一个类继承自Thread类 class MyThread extends Thread { //2.重写run方法 @Override public void run() { } } public class Demo01 { public static void main(String[] args) { MyThread myThread =new MyThread(); myThread.setDaemon(true); myThread.start(); System.out.println("Thread 线程类型:" + (myThread.isDaemon() == true ? "守护线程" : "用户线程")); System.out.println("main 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程")); } }
测试结果
2.2 线程池设置
线程池设置为守护线程相对来说麻烦一些,需要将线程池中的所有线程都设置成守护线程,这个时候就需要使用线程工厂 ThreadFactory 来设置
public class Demo06 { public static void main(String[] args) throws InterruptedException { // 线程工厂(设置守护线程) ThreadFactory threadFactory = r -> { Thread thread = new Thread(r); // 设置为守护线程 thread.setDaemon(true); return thread; }; // 创建线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new LinkedBlockingQueue<>(100), threadFactory); threadPool.submit(new Runnable() { @Override public void run() { System.out.println("ThreadPool 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程")); } }); Thread.sleep(2000); } }
测试结果
3. 用户线程 与 守护线程的运行区别
//(1) 定义一个任务类MyRunnable,实现Runnable接口 class MyRunnable implements Runnable { private String name; @Override //(2) 重写接口中的run方法,用于定义任务的内容 public void run() { for (int i = 0; i < 5; i++) { System.out.println(getName() + "打了" + i + "小兵"); } } public String getName() { return name; } public void setName(String name) { this.name = name; } } public class Demo03 { public static void main(String[] args) { //(3) 创建任务类对象,表示任务 MyRunnable myRunnable = new MyRunnable(); myRunnable.setName("鲁班"); //创建Thread类对象,创建线程 //(4) 创建Thread类对象,创建线程,将任务对象作为构造方法的参数传递,用于执行任务的类对象 Thread(Runnable r) Thread thread = new Thread(myRunnable); //启动线程 //(5) 调用线程开启的方法,start() 开启新线程 // 设置守护线程 // thread.setDaemon(true); thread.start(); } }
用户线程结果
守护线程结果
取消31行的注释
现在再回去看 Thread.setDaemon(true) 方法
The Java Virtual Machine exits when the only threads running are all daemon threads.
当唯一运行的线程都是守护线程时,Java 虚拟机退出。
便一目了然
4. 总结
Java的线程有 用户线程 和 守护线程
正常的线程创建就是用户线程, 而作为服务用户线程的守护线程来说, 守护线程的设置, 需要在 start()前
设置daemon属性
关于守护线程, 当唯一运行的线程都是守护线程时,Java 虚拟机退出.所以可以理解成守护线程的权重是在Java体系中较低的.
5. 参考 & 致谢
https://juejin.cn/post/7075533443450273800
https://juejin.cn/post/6844903966539513870
Redis守护线程如何开启?
1. 什么是Redis
Redis是一个高性能的key-value数据库 / 是一个单线程的NoSQL数据库
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。一般大型网站的应用和数据库之间的那一层就是Redis。比如京东商城的页面查找功能,用户接触到的查询的第一层就是Redis数据缓存层,缓存中找不到的数据,再进入数据库查询。Redis中缓存热点数据,能够保护数据库,提高查询效率。
2. 应用场景
- 会话缓存(最常用)
- 消息队列(支付)
- 活动排行榜或计数
- 发布,订阅消息(消息通知)
- 商品列表,评论列表
3. 启动Redis守护线程
-
安装好Redis
自己百度, 就解压一下就可以
-
进入到redis的安装目录
cd ......../redis/bin redis目录结构
-
编辑redis的配置文件
which redis.conf # 或 whereis redis.conf) vim redis.conf # 修改文件 将daemonize设置的值设置为yes -
启动Redis
cd ......../redis/bin ./redis-server redis.conf
现在只要防火墙的端口是开放的 , 便可以通过
Another Redis Desktop Manager
直接访问redis
4. 说明
在配置Redis的守护线程启动 , 仅需设置其Redis.conf下的daemonize属性
daemonize:yes:
redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表
开启守护进程模式
。在该模式下,redis会在后台运行(外界可访问)
,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no:当daemonize选项设置成no时,当前界面将进入
redis的命令行界面(外界无法访问)
,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)