java线程池的大小如何设置?

概念,IO密集型和CPU密集型

CPU密集型(计算密集型):

cpu密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力 计算机密集型任务主要消耗CPU资源,因此,代码运行效率至关重要,Python这样的脚本代码运行效率很低,完全不适合计算机密集型任务。对于计算密集型任务,最好用C语言编写。

IO密集型
IO密集型涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但是也有一个限度。常见的大部分任务都是IO密集型任务,比如web应用。

大家对线程数量的设置有一个经验的计算公式

 如果是CPU密集型应用,则线程池大小设置为N+1(N:CPU的个数)
 如果是IO密集型应用,则线程池大小设置为2N+1

如果一台服务器上只部署这一个应用并且只有这一个线程池,那么这种估算或许是合理的。但是在IO优化中,下面的估算公式是可能更合适:

 最佳线程数量=((线程等待时间+线程CPU时间)/线程CPU时间)*CPU数目

显然,线程等待时间所占比例越高,需要的线程数量 就越多,反之则越少。

举个例子,一台8核的服务器,平均每个CPU运行时间为1S,线程等待时间(非CPU运行时间)为2S,那么公式就是((1+2)/1)*8 = 24 。公式可以进一步转化为:

最佳线程数量=(线程的等待时间与线程的计算(CPU)时间之比+1)*CPU数目

最后总结:

其实要想获得最准确的线程数量,我们还需要通过压力测试来进行微调,只有经过压力测试过的才是最适用于自己的项目的。

你可能感兴趣的:(多线程,Java)