【Java成神之路】线程池中的的线程数一般怎么设置?需要考虑哪些问题?

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时间不好测量,实际情况使用得比较少,一般用经验值就差不多了。再配合系统压测,基本可以确定最适合的线程数。


最新评论: