对于线程池的介绍已经在上一篇文章中介绍完毕,那么对于创建线程池时如何确定线程数目,是一个值得思考和关注的问题。
首先根据查阅资料得知:线程池中线程的数目是跟线程池所要处理的任务性质有关,也就是说线程的数目确定是受影响于 任务是属于 CPU密集型任务 还是 IO密集型任务 。
CPU密集型(CPU-bound)
CPU密集型也叫计算密集型,指的是系统花费相对大部分时间在做CPU运算、逻辑判断等,CPU使用率很高,典型的如加密运算。一般来说:大量纯计算就是 CPU 密集型。
IO密集型(I/O bound)
IO密集型指的是系统花费大部分时间在等待相对较慢的I/O操作完成,如硬盘文件的读写。一般来说:大量网络,文件操作就是 io 密集型。
了解了什么 CPU密集型和IO密集型后,我们可以按照下面的步骤确定线程数:
1.先看下机器的CPU核数,然后在设定具体参数:
System.out.println(Runtime.getRuntime().availableProcessors());
即 CPU核数 = Runtime.getRuntime().availableProcessors()
2.分析下线程池处理的程序是CPU密集型,还是IO密集型
CPU密集型:核心线程数 = CPU核数 + 1
IO密集型:核心线程数 = CPU核数 * 2
注:IO密集型(某大厂实践经验)
核心线程数 = CPU核数 / (1-阻塞系数) 例如阻塞系数 0.8,CPU核数为4
则核心线程数为20