Java 并发编程之线程池大小
Java juc 面试 About 693 words说明
关于线程池大小的设置,有很多文章和经验公式,给出的答案不尽相同。
Java并发编程实战
《Java并发编程实战》:第8
章 - 线程池的使用。第141
页。
计算密集型
结论:Nthreads=Ncpu+1
在拥有多核CPU
的系统上,设置线程池的大小为CPN
的核数加1
,能实现最优的利用率。
即使当计算密集型的线程偶尔由于页缺失故障或其他原因暂停,这个额外的线程(加1
)也能确保CPU
的时钟周期不会被浪费。
I/O或阻塞密集型
Web
应用都是I/O
密集型。
Ncpu:CPU
核数。
Ucpu:期望的CPU
利用率。
W:CPU
等待的时间(可以理解为空闲时间)。
C:CPU
计算的时间。
结论:Nthreads=Ncpu*Ucpu*(1+W/C)
经验公式
线程数 = 核数 * 期望CPU
利用率 * 总时间 / CPU
计算时间
总时间:CPU
计算时间 + 等待时间
示例
例如:4
核CPU
计算时间为50%
,其他等待时间是50%
,期望CPU
被100%
利用。
计算:4*100%*100%/50%=8
例如:4
核CPU
计算时间为10%
,其他等待时间是90%
,期望CPU
被100%
利用。
计算:4*100%*100%/10%=40
并发编程网
相关数值设置可参考链接博客。
http://ifeve.com/how-to-calculate-threadpool-size
相关概念
阿姆达尔定律
原文:http://tutorials.jenkov.com/java-concurrency/amdahls-law.html
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓