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

导读:本篇文章讲解 如何合理地配置线程池的线程数,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

不同的任务 不同的配置

·任务的性质: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数目

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92810.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!