Java 并发编程之线程池大小

Java juc 大约 693 字

说明

关于线程池大小的设置,有很多文章和经验公式,给出的答案不尽相同。

Java并发编程实战

《Java并发编程实战》:第8章 - 线程池的使用。第141页。

计算密集型

结论:Nthreads=Ncpu+1

在拥有多核CPU的系统上,设置线程池的大小为CPN的核数加1,能实现最优的利用率。

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

I/O或阻塞密集型

Web应用都是I/O密集型。

NcpuCPU核数。

Ucpu:期望的CPU利用率。

W:CPU等待的时间(可以理解为空闲时间)。

C:CPU计算的时间。

结论:Nthreads=Ncpu*Ucpu*(1+W/C)

经验公式

线程数 = 核数 * 期望CPU利用率 * 总时间 / CPU计算时间

总时间:CPU计算时间 + 等待时间

示例

例如:4CPU计算时间为50%,其他等待时间是50%,期望CPU100%利用。

计算:4*100%*100%/50%=8

例如:4CPU计算时间为10%,其他等待时间是90%,期望CPU100%利用。

计算:4*100%*100%/10%=40

并发编程网

相关数值设置可参考链接博客。

http://ifeve.com/how-to-calculate-threadpool-size

相关概念

阿姆达尔定律

原文:http://tutorials.jenkov.com/java-concurrency/amdahls-law.html

译文:http://ifeve.com/amdahls-law

阅读 63 · 发布于 2021-11-15

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批