在《Java 并发编程实战》中介绍了一个线程数计算的公式
图片
如果希望程序跑到CPU的目标利用率,需要的线程数公式为:
图片
公式很清晰,现在来带入上面的例子试试看:
如果我期望目标利用率为90%(多核90),那么需要的线程数为:
核心数12 * 利用率0.9 * (1 + 50(sleep时间)/50(循环50_000_000耗时)) ≈ 22
分析一下,W是等待时间比如IO等待的时间,C是计算时间即我完成那么多次循环一共耗时是多少
现在把线程数调到22,看看结果:
图片
现在CPU利用率大概80+,和预期比较接近了,由于线程数过多,还有些上下文切换的开销,再加上测试用例不够严谨,所以实际利用率低一些也正常。