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扫描下方二维码关注公众号和小程序↓↓↓