栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

不同的任务 不同的配置

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

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

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

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

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

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

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

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

为什么要加1呢?

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

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

java线程池大小为何会大多被设置成CPU核心数+1?_varyall的博客-CSDN博客_为什么线程池的数量是cpu核数+1 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数目

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/877888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号