java并发编程一一线程池原理分析(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34846877/article/details/83819696

合理的设置线程池的大小

接着上一篇探讨线程留下的尾巴。如果合理的设置线程池的大小。
要想合理的配置线程池的大小、首先得分析任务的特性,可以从以下几个角度分析:
1、任务的性质:CPU密集型任务、IO密集型任务、混合型任务等;
2、任务的优先级:高、中、低;
3、任务的执行时间:长、中、短;
4、任务依赖性:是否依赖其它系统资源,如数据库的连接等;
性质不同的任务可以交给不同规模的线程池执行。
对不不同性质的任务来说,CPU密集型任务应配置尽可能小的线程,如配置CPU个数+1 的线程数。IO密集型任务应配置尽可能多的线程,因为IO操作不占用CPU,不用让CPU闲下来,应加大线程数量。如配置两倍CPU格式+1 ,而对于混合型的任务,如果可以拆分,拆分成IO密集型和CPU密集型分别处理,前提是两者运行图的时间差不多的,如果处理时间相差很大,则没有必要拆分了。

若人物对其他系统资源有依赖,如某个任务依赖数据库的连接返回的结果,这时候等待的时间越长,则CPU的空时间越长,那么线程数量应设置的越大,才能更好的利用CPU。
当然具体合理的线程池的值大小,需要结合系统实际情况,在大量的尝试下比较才能得出,以上只是前任总结的规律。

最佳线程数目 = ((线程等待时间+线程CPU时间)/ 线程CPU时间) CPU数目*
比如平均每个线程CPU运行时间为 0.5s ,而线程等待时间(非CPU运行时间,比如 IO)为1.5s,CPU核心数为8, 那么根据上述公诉估算得出: ((0.5 + 1.5)/0.5) *8 =32。这个公式进一步转化为:
最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1) * CPU数目
可以得出一个结论:
线程等待的时间所占比例越高,需要越多线程。线程CUP时间所占比例越高,需要越少线程。
以上公式与之前的CPU和IO密集型任务设置线程数及本吻合。

CPU密集型时,任务可以少配置线程数,大概和及其的CPU核数相当,这样可以使得每个线程都在执行任务;
IO密集型时,大部分线程都阻塞,故需要多配置线程数,2*CPU核数
操作系统之名称解释:
某些进程花费了绝大多数时间在计算上,而其他则在I/O上花费大多是时间
前者称为计算机密集型(CPU密集型)computer-bound ,厚着称为I/O密集型,I/O-bound。

猜你喜欢

转载自blog.csdn.net/qq_34846877/article/details/83819696