既然看到ConnectionFactory中有使用jdk自带ThreadFactory类,我想研究一下它源码,浅尝辄止,也就是如下这一行代码
private ThreadFactory threadFactory = Executors.defaultThreadFactory();
1、ThreadFactory
-
它一个接口且只有一个newThread方法,传入一个Runnable参数
-
它设置作用就是避免硬调用new Thread方法, 同时也可以做一下控制
-
最简单实现这个接口:
-
class SimpleThreadFactory implements ThreadFactory{ public Thread newThread(Runnable r){ return new Thread(r); } }
-
-
如果你不想自己实现这个接口就直接使用Executors#defaultThreadFactory()也就是rabbitmq使用方法
2、Executors.DefaultThreadFactory
2.1、成员变量
field | default(默认) | 含义 |
---|---|---|
poolNumber | 1 | 线程池编号(其实就是工厂类编号)每次+1 |
group | null | 线程所在组 |
threadNumber | 1 | 线程编号(每个工厂类的线程编号都是从1开始的) |
namePrefix | null | 线程名称前缀,格式为pool-工厂类编号-thread- |
- group: SecurityManager对应线程组优先级是最高的,其实就是当前线程
- 线程名称:pool-工厂类编号-thread-线程编号
- 如果创建线程是守护线程,这设置它为不是守护线程
- 如果优先级不等于5,则设置它优先级为5
2.2、验证代码
-
/** * 验证 * @author liangchen * @date 2021/6/4 */ public class TestThreadFactory { public static void main(String[] args) { ThreadFactory threadFactory1 = Executors.defaultThreadFactory(); Thread thread1 = threadFactory1.newThread(() -> System.out.println(11)); Thread thread2 = threadFactory1.newThread(() -> System.out.println(22)); ThreadFactory threadFactory2 = Executors.defaultThreadFactory(); Thread thread21 = threadFactory2.newThread(() -> System.out.println(11)); Thread thread22 = threadFactory2.newThread(() -> System.out.println(22)); System.out.println(thread1.getName() + ":" + thread1.getPriority()); System.out.println(thread2.getName() + ":" + thread1.getPriority()); System.out.println(thread21.getName() + ":" + thread1.getPriority()); System.out.println(thread22.getName() + ":" + thread1.getPriority()); } }
-
输出结果
-
pool-1-thread-1:5 pool-1-thread-2:5 pool-2-thread-1:5 pool-2-thread-2:5
-
结尾
- 感谢大家的耐心阅读,如有建议请私信或评论留言。
- 如有收获,劳烦支持,关注、点赞、评论、收藏均可,博主会经常更新,与大家共同进步
- 下一篇就是分析rabbitmq客户端Connection对象