《java 并发编程实战》 一书中,Brian Goetz和合著者们为线程池大小的优化提供了建议。如果线程池中线程的数量过多,最终它们会竞争稀缺的处理器核内存资源,浪费大量的时间在上下文切换上。反之,如果线程的数目过少,正如你的应用所面临的情况,处理器的一些可能就无法充分利用。
线程池大小与处理器的利用率之比使用下面的公式进行估算:
Nthreads = NCPU * UCPU* (1 + W/C)
其中:
- NCPU是处理器的核的数目,可以通过Runtime.getRuntime().availableProcessors()得到。
- UCPU 是期望的CPU利用率(该值介于0~1之间)
- W/C 是等待时间与计算时间的比率