如何合理地配置线程池的线程数

本文探讨了如何根据任务性质配置线程池大小。CPU密集型任务建议配置为CPU核心数+1,以应对可能的线程暂停情况。IO密集型任务则应配置更多线程,例如2倍CPU核心数。对于混合型任务,可拆分为CPU和IO任务分别处理。线程池大小的计算公式考虑了线程等待时间和CPU时间的比例,以最大化吞吐量。
摘要由CSDN通过智能技术生成

参考:《并发编程的艺术》

不同的任务 不同的配置

·任务的性质:CPU密集型任务、IO密集型任务和混合型任务。

性质不同的任务可以用不同规模的线程池分开处理。CPU密集型任务应配置尽可能小的

线程,如配置Ncpu+1个线程的线程池。由于IO密集型任务线程并不是一直在执行任务,则应配

置尽可能多的线程,如2*Ncpu。混合型的任务,如果可以拆分,将其拆分成一个CPU密集型任务

和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐量

将高于串行执行的吞吐量。如果这两个任务执行时间相差太大,则没必要进行分解。

CPU密集型的任务,也就是每一个任务都一直在使用CPU,如果线程池中正在运行的线程比CPU核数多很多,必然会造成一个CPU上频繁的进行上下文切换,切换到不同的线程去执行。

如果正好等于CPU核数,那么一个线程一个CPU正好可以高效率的利用CPU。

为什么要加1呢?

java线程池大小为何会大多被设置成CPU核心数+1? - 知乎

(即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费。)

IO优化中,这样的估算公式可能更适合:


最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
因为很显然,线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。
下面举个例子:
比如平均每个线程CPU运行时间为0.5s,而线程等待时间(非CPU运行时间,比如IO)为1.5s,CPU核心数为8,那么根据上面这个公式估算得到:((0.5+1.5)/0.5)*8=32。这个公式进一步转化为:
最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值