我们常常会问多线程相关知识,那么线程池的设置问题就避免不了,那么,我们应该怎么回答或者怎么思考解决这个问题呢?
其实这个问题反映的是如何设置使得计算机资源利用率最大化。
我们回答的时候可以说:
为了提高 CPU 的利用率
,一般我们可以设置线程池的为CPU核心数或者核心数的2倍。
线程池的理想大小 取决于提交任务的类型以及所部署系统的特性,不应该在程序中写死,
线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程
我们要根据任务是 :计算密集型 or I/O密集型
来设置线程池的大小。
计算密集型
是指处理这种任务时,线程不会发生阻塞,线程不阻塞就一定程度代表 CPU 一直在忙碌;
I/O 密集型
是指运行该类任务时线程多会发生阻塞,一旦阻塞,CPU 就多被闲置,浪费 CPU 资源。
通俗的说:
-
一些进程绝大多数时间在计算上,称为计算密集型(CPU密集型)computer-bound。
-
而有一些进程则在input 和output上花费了大多时间,称为I/O密集型,I/O-bound。比如搜索引擎蜘蛛大多时间是在等待相应这种就属于I/O密集型。
当是i/o密集性时,等待时间更长,需要线程数就更多,所以我们可以设置为2倍,
而计算机密集型,执行速度很快,但是不停的执行,基本上CPU都是满负荷运行,那么核心数即线程数就更为合适。
计算公式可以参考书籍:《Java 并发编程实战》