线程池多大合适?
它是有公式的,看你的项目是什么类型的。
项目一般会把它分成两种类型:CPU密集型、I/O密集型。
假设如果你的项目中计算比较多,但是读取本地文件/读取数据库的操作比较少,那就属于上面的CPU密集型运算,这种情况下我们通常会采用 最大并行数 + 1
就行了,这样就可以实现最优的CPU利用率。
+1
是为了保证当前项目由于ye缺失故障,或者因为一些其他原因导致线程暂停,如果这个线程有问题了,那么额外的线程就可以顶上去。此时就能保证CPU的时候周期不被浪费。简单理解:前面的线程如果出问题了,那么后面的+1就好比是候补的,可以顶上去。
但是如果你的项目读取本地文件操作会比较多,或者读取数据库的操作比较多,这个项目就是 I/O密集型项目
,而我们现在大多数项目都是 I/O密集型项目
,在这个项目中,CPU并不是总是处于繁忙状态的。
例如当我们进行业务计算的时候,此时就会使用CPU的资源;但是当你进行 I/O操作
的时候/操作数据库的时候,这个时候CPU就闲下来了,此时就可以利用多线程技术将闲下来的时间给利用起来,从而提高了CPU的利用率。
解释公式:以 4核8线程
的电脑为例
-
最大并行数是8
-
期望CPU利用率:那我肯定希望它100%被利用,因此这里就写100%
-
总时间包括CPU计算时间和等待时间。
例如我现在要从本地文件中读取两个数据,并进行相加,在这个过程里面它至少会有两个操作:1、读取两个数据;2、相加。那么在这两个操作中,读取本地文件中的数据它是跟硬盘有关系的,跟CPU是没有关系的,只有相加才跟CPU是有关系的。假设这两个操作都是耗时1秒钟,那么套用公式,总时间:2s,CPU计算时间:1s,那我就可以这么认为:总时间是100%,CPU的计算时间占50%,这个时候我们就可以将CPU等待的时间拿出来做其他的事情。
因此按照计算公式可以得到,结果是16。因此我就可以规定线程池的总大小就是16。
CPU计算时间和等待时间其实是需要我们利用工具测试的,例如有一款工具叫做 thread dump
,它就可以测试。
一旦测试后,就可以套用公式计算结果了。