【Java应用】设置线程池最佳的线程数

【Java应用】设置线程池最佳的线程数

一、前言

在使用线程池时,经常涉及到线程池应该设置多少线程的情况,它关系到我们程序执行的性能,大多数情况是凭经验设置,但是缺少依据;
在一般情况下,可以将程序分为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();

猜你喜欢

转载自blog.csdn.net/weixin_37598243/article/details/128279415