怎么选择合适的线程数量?

为什么要设置线程数量

我们在开发中使用线程池是为了避免线程反复创建和销毁的开销,而线程池中的线程数也应该设置成合适的数量,才能合理且充分的利用CPU以及内存资源,使程序的性能得到提高。

直接看一个公式

《Java并发编程实战》的作者Brain Goetz推荐的计算合适线程数量的方法如下:

线程数 = CPU 核心数 *(1+平均等待时间/平均工作时间)

一般情况下,直接参照这个计算公式来设置线程数量就好了。

解读下这个计算方法

首先要了解,线程任务分为两种类型,一种是CPU密集型任务,另一种是耗时IO型任务。

从公式里可以推导出来,平均等待时间所占比例越大,合适的线程数量就越大,相反的,平均工作时间所占比例越大,那么合适的线程数量就相应的减少。这其实就对应了以上的两种任务。

CPU密集型的任务

如果是CPU密集型的任务,设计到计算等操作,平均工作时间所占比例就会更大,这时候如果线程数量太多也没用,因为CPU都已经是在全力工作了,而这时候,每个线程又都想要拿到CPU资源来执行自己的任务,因为线程的每一次状态的保存到切换回来继续执行,都是一次上下文切换,这样过多的线程就会造成很多不必要的上下文切换了,可以打个比方,CPU本来就不是很闲,大家都还要争着用它,线程一都还没计算完,线程二又拿了CPU资源去执行任务,线程二执行到一半,又切回了线程一,然后线程一终于执行好任务了,最后又切回了线程二执行。这里只拿了两个线程打个比方,多个线程肯定更加的复杂,所以在CPU被充分利用的情况下,线程数不用太多,最佳的线程数可以设置为CPU 核心数的1~2 倍。

耗时的IO型任务

如果是耗时的IO型任务,因为IO的读写速度是比CPU慢的,所以很可能在IO等待时间的时候,CPU资源是空闲着的,这时候如果线程数过少,那么等待的任务就会累积,同时会造成CPU资源的浪费。相反的,设置大于CPU好多倍的线程数,那么在一些线程在做IO操作的时候,由于这时候CPU是空闲的,其他的线程就可以利用CPU去执行别的任务,就可以把CPU资源充分的利用起来,也可以更快的处理完任务。

总结

综上,结合自己系统的线程任务平均等待时间以及平均工作时间,配合计算公式,就可以得出合适的线程数量了。

原创文章 358 获赞 387 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/105612546
今日推荐