一、前言
在使用线程池时,经常涉及到线程池应该设置多少线程的情况,它关系到我们程序执行的性能,大多数情况是凭经验设置,但是缺少依据;
在一般情况下,可以将程序分为CPU密集型
和I/O密集型
,而对于这两种密集型程序来说,计算最佳线程数的方法是不同的。
二、CPU密集型
对于CPU密集型
程序来说,多线程重在尽可能多地利用CPU的资源来处理任务,所以在理论上,线程数=CPU核数
是最合适的。但是在实际工作中,一般会将线程数设置为:CPU核数+1
,这是为了放在出现意外情况导致线程阻塞。如果某个线程因意外情况阻塞,那么出来的线程会继续执行任务,从而保证CPU的利用率;
因此,在CPU密集型的程序中,一般可以将线程数设置为:CPU核数+1
。
三、I/O密集型
对于I/O密集型程序来说,如果在某个线程执行I/O操作时,另外的线程恰好执行完CPU计算任务,那么此时CPU的利用效率最佳。所以,在I/O密集型程序中,理论上最佳的程序数与程序中I/O操作的耗时和CPU计算的耗时的比值相关。
在单核CPU下,理论上的最佳线程数=1+(I/O操作的耗时/CPU计算的耗时)
在多核CPU下,理论上的最佳线程数=CPU核数 * (1+I/O操作的耗时
/CPU计算的耗时
)
四、总结
通过上述方式计算出的线程数只是理论上的最佳线程数,在实际工作中,还是需要对系统不断地进行压测
,并根据压测的结果确定最佳的线程数
;
在实际环境中,可能存在不同的进程或者存在多个线程的情况,所以需要设置的线程数,要结合实际运行环境的资源利用率情况;
注:获取CPU核数Runtime.getRuntime().availableProcessors()
;