线程池动态修改核心线程数

本文详细解析了线程池中如何通过setCorePoolSize方法动态调整核心线程数的过程。当新的核心线程数减少时,将中断多余的线程;当增加时,会逐步增加至目标数量,每次添加新线程前检查任务队列。

通过线程池的方法重新设置核心线程数 setCorePoolSize

当最新的核心线程数小于之前的核心线程数时,则需要进行多余的线程中断

当最新的核心线程数大于之前的核心线程数,则需要逐步的增加核心线程数

源码如下:

 public void setCorePoolSize(int corePoolSize) {
        if (corePoolSize < 0)
            throw new IllegalArgumentException();
        int delta = corePoolSize - this.corePoolSize;
        this.corePoolSize = corePoolSize;
        if (workerCountOf(ctl.get()) > corePoolSize)
            interruptIdleWorkers();
        else if (delta > 0) {
            // We don't really know how many new threads are "needed".
            // As a heuristic, prestart enough new workers (up to new
            // core size) to handle the current number of tasks in
            // queue, but stop if queue becomes empty while doing so.
            int k = Math.min(delta, workQueue.size());
            while (k-- > 0 && addWorker(null, true)) {
                if (workQueue.isEmpty())
                    break;
            }
        }
    }

 

 备注:当最新的核心线程数大于之前核心线程数时,不是一致性增加差额的线程数,而是一个一个线程添加,添加完一个再去查询任务队列是否有任务;有任务则再次添加,没有任务则就此停止

线程池核心线程数的分配需要考虑多方面因素,主要包括服务器配置、服务器资源预算(CPU 数、内存、IO 支持的最大 QPS)以及任务自身特性(是 IO 密集型还是 CPU 密集型)等 [^3]。 ### 查看服务器 CPU 核数 可以通过代码或命令查看服务器的 CPU 核数。代码查看方式为: ```java System.out.println(Runtime.getRuntime().availableProcessors()); ``` 命令查看方式如下: ```bash # 查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l # 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu cores"| uniq # 查看逻辑CPU的个数 cat /proc/cpuinfo| grep "processor"| wc -l ``` ### 根据任务类型分配核心线程数 - **CPU 密集型任务**:设置线程数为 N + 1(N 为 CPU 数量),某时因为发生一个页面错误或其他原因而暂停,这个额外线程可以确保不会停止工作 [^3]。 - **IO 密集型任务**: - 常见经验值公式:核心线程数 = CPU 核数 * 2 + 1。因为 IO 密集型任务的大部分时间都在等待,若设置的线程数等于 CPU 核数,当所有线程都在等待 I/O 时,CPU 会完全空闲,造成资源浪费。因此需要配置更多的线程,当一部分线程在等待时,另一部分线程可以继续使用 CPU。“* 2”是一个经验性的系数,意味着假设线程的等待时间和计算时间大致相等,“+ 1”同样是为了备份 [^4]。 - 进阶公式:核心线程数 = CPU 核数 * (1 + 线程平均等待时间 / 线程平均计算时间),这个公式可以更精确地反映 IO 密集程度。例如,如果等待时间是计算时间的 3 倍,那么线程数就可以设置为 CPU 核数 * (1 + 3) = CPU 核数 * 4 [^4]。 在实际操作中,很少出现纯 IO 和纯计算任务,大部分任务是计算后修改内存,因此要按照一个思路去设置线程数,主要考量两方面,一个是 CPU 的利用率 + 数量,另一个是 IO 任务支持的最大 QPS [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值