2022-04-15 10:49:47 晓掌柜 版权声明:本文为站长原创文章,转载请写明出处
在使用线程池时,都会有这样的疑问,不知道如何配置线程数量,今天我们一起探讨一下这个问题。
1、配置线程数量之前,首先要看任务的类型是 IO密集型,还是CPU密集型?
① 什么是IO密集型?
比如:频繁读取磁盘上的数据,或者需要通过网络远程调用接口。
② 什么是CPU密集型?
比如:非常复杂的调用,循环次数很多,或者递归调用层次很深等。
2、IO密集型配置线程数经验值是:2N,其中N代表CPU核数。
3、CPU密集型配置线程数经验值是:N + 1,其中N代表CPU核数。
4、如果获取N的值?
int availableProcessors = Runtime.getRuntime().availableProcessors();
那么问题来了,混合型(既包含IO密集型,又包含CPU密集型)的如何配置线程数?
PS: 混合型如果IO密集型,和CPU密集型的执行时间相差不太大,可以拆分开,以便于更好配置。如果执行时间相差太大,优化的意义不大,比如IO密集型耗时60s,CPU密集型耗时1s。
除了上面介绍是经验值之外,其实还提供了计算公式:
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
很显然线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。
虽说最佳线程数目算法更准确,但是线程等待时间和线程CPU时间不好测量,实际情况使用得比较少,一般用经验值就差不多了。再配合系统压测,基本可以确定最适合的线程数。