Dubbo 源码剖析与实战
何辉
平安壹钱包架构师
4711 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
开篇词 (1讲)
Dubbo 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

26|线程池扩展:如何选择Dubbo线程池?

你好,我是何辉。今天我们继续学习 Dubbo 拓展的第四篇,线程池扩展。
提到线程池,我们在前面“异步化实践”中通过“线程池耗尽”这个现象已经接触到了,Dubbo 采用默认的线程池,也就是 200 个核心线程,来提供服务,其实我们已经用得非常舒服了,业务正常运转没什么阻碍。
不过你知道吗,Dubbo 框架里面其实有 4 种线程池,那其他的线程池存在的意义是什么,我们在使用时该怎么选择呢?
带着这个问题,今天我们来点轻松的,带你掌握 Dubbo 4 种线程池的用法。

线程池原理

在具体分析每一种线程池之前,我们还是回忆一下创建线程池的核心代码参数,看一看添加任务到线程池的大致工作原理是什么样的。
///////////////////////////////////////////////////
// java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java.util.concurrent.TimeUnit, java.util.concurrent.BlockingQueue<java.lang.Runnable>, java.util.concurrent.ThreadFactory, java.util.concurrent.RejectedExecutionHandler)
// 线程池最核心的构造方法
///////////////////////////////////////////////////
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
// 核心线程数量小于 0,则抛出参数非法异常
if (corePoolSize < 0 ||
// 最大线程数量小于等于 0,则抛出参数非法异常
maximumPoolSize <= 0 ||
// 最大线程数量小于核心线程数量,则抛出参数非法异常
maximumPoolSize < corePoolSize ||
// 非核心线程空闲时的存活时间小于0,则抛出参数非法异常
keepAliveTime < 0)
throw new IllegalArgumentException();
// 没有配置任务队列、没有配置创建线程的工厂、没有配置拒绝策略,一律抛出参数非法异常
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
// 剩下的就是一些入参的赋值逻辑了
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Dubbo线程池选择指南中,作者何辉介绍了Dubbo框架中的四种线程池类型:FixedThreadPool、LimitedThreadPool、CachedThreadPool和EagerThreadPool。文章深入解释了每种线程池的实现方式和特点,以及如何根据业务需求选择合适的线程池类型。 FixedThreadPool采用固定核心线程数量和阻塞队列,适合稳定的业务场景。LimitedThreadPool则适合弹性分配线程池数量的业务场景。CachedThreadPool支持设置非核心线程的空闲存活时间,适合处理突发任务并自动销毁非核心线程的情况。特别值得关注的是EagerThreadPool,它打破了线程池固有的流程机制,允许用户自由设置核心线程数、最大线程数和非核心线程的存活时间。 文章还提供了一个监控案例,展示了如何实践监控Dubbo线程池的能力,为读者提供了更加直观的理解和应用。总的来说,本文内容丰富,涵盖了Dubbo线程池的原理、特点和监控实践,对于需要深入了解Dubbo框架中线程池的读者来说,是一篇非常有价值的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Dubbo 源码剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 准时不早退的嘉然
    老师您好,如果想做线程池隔离要怎么实现呢?现在有个需求,要为不同服务接口分配不同的线程数量

    作者回复: 你好,准时不早退的嘉然:你这种带着极具明显业务功能色彩的操作,核心线程、最大线程、队列大小、核心是否超时、空闲等待时长等参数都会有着不太一样的诉求,建议最好还是自己创建线程池自己规划,根据不同的业务类型拿到不同的线程池对象(这个拿的过程就可以抽象为策略模式)。

    2023-03-11归属地:广东
收起评论
显示
设置
留言
1
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部