首页 > java线程池大小为何会大多被设置成CPU核心数+1?

java线程池大小为何会大多被设置成CPU核心数+1?

线程池大小设置成与CPU核心数相等我是可以理解的,但是为什么有的默认线程池大小是CPU核心数+1(参考android的AsyncTask的实现)。
既然可以是+1,那+2,+3又有多大的影响呢


线程数一个计算公式,
线程数=CPU核心数/(1-阻塞系数)
看你的任务是计算密集性的还是IO密集性的
IO密集型的,阻塞系数加大,计算密集型的阻塞系数减少
阻塞系数可以将其理解为 阻塞时间/计算时间;

最理想的情况,每个CPU在计算过程中,没有任何的IO阻塞,那么线程数为CPU核心数
如果阻塞严重,意味为CPU核心等待的时间消耗会很长,此时CPU调度系统会将此CPU核心让渡出来,执行其他的计算任务,此时线程数就应该相应的增大
如果阻塞很小,CPU空闲时间很少,CPU将近100%的被利用,那么你设置再多的线程数也没用,线程池还是要等待

实际在CPU利用过程中,CPU不会把全部资源交给线程池处理任务,还需要处理其它计算任务~~~


假设你的任务非常消耗CPU, 那么现在每个CPU都被占满了, 你再增加线程个数, 只能降低系统的效率, 因为线程还需要切换;
假如你的任务不是那么消耗CPU, 那么现在可能每个CPU都有空闲, 你增加线程个数, 也没有什么卵用.

所以, 最佳线程个数一般在N和N+1之间选择.

【热门文章】
【热门文章】