Java线程池maximumPoolSize和workQueue哪个先饱和?

先说结论,真正的饱和顺序是corePoolSize -> workQueue -> maximumPoolSize。


我们都知道,线程池有以下参数

java 复制代码
ThreadPoolExecutor(int corePoolSize, //核心线程数
                  int maximumPoolSize, //
                  long keepAliveTime,
                  TimeUnit unit,
                  BlockingQueue<Runnable> workQueue)
  • corePoolSize:核心线程池大小,即使没有任务,这些线程也会一直存活。
  • maximumPoolSize:最大线程池大小,当任务量超过核心线程数时,最多可以创建这么多线程。
  • keepAliveTime:非核心线程在空闲时等待新任务的最长时间。
  • unit:keepAliveTime 的时间单位。
  • workQueue:阻塞队列,用于存储待执行的任务。常见的阻塞队列实现有 ArrayBlockingQueue、LinkedBlockingQueue 和 SynchronousQueue 等。

我之前的理解是,当线程数达到corePoolSize后,新任务到来会创建新线程直到达到maximumPoolSize,当达到maximumPoolSize后,新任务才会放到workQueue里。

但其实,这一直都是错误的理解,真正的饱和顺序是corePoolSize->workQueue->maximumPoolSize。

下面开始验证

java 复制代码
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
for (int i = 0; i < 6; i++) {
    int finalI = i;
    executor.submit(() -> {
        System.out.println(Thread.currentThread().getName() + " " + finalI);
        try {
            Thread.sleep(5000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    });
}
executor.shutdown();

若corePoolSize满了后新任务是创建新线程,那么这里应该一次打印6条日志。

若corePoolSize满了之后新任务放到workQueue里,那么这里应该打印两次,第一次5条,第二次1条。

打印结果

由此可见符合第二种情况,为了证明可信度下面再验证一种情况

java 复制代码
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
for (int i = 0; i < 16; i++) {
    int finalI = i;
    executor.submit(() -> {
        System.out.println(Thread.currentThread().getName() + " " + finalI);
        try {
            Thread.sleep(5000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    });
}
executor.shutdown();

按照上面的结论推测,当我们有16个要执行的任务,首先会占用5个核心线程,然后放10个任务到阻塞队列,剩下的1个加上核心线程数是6个,达不到最大线程数,所以会创建活动线程,此时线程池中会有6个可用线程。所以会分三次打印结果,第一次6条,第二次6条,第三次4条。下面验证推测

验证成功!

相关推荐
荣码10 分钟前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python
极限挑战哥40 分钟前
共享电单车联营平台分账架构实践:二清合规与自动分账零人工方案
java·大数据·人工智能·微信小程序·架构·微信公众平台
皮皮林5511 小时前
比 VMware 更快,更轻的虚拟机,横空出世!
java
Thomas.Sir1 小时前
第13课:MyBatis-Plus整合SpringBoot4.x,分页、条件查询、逻辑删除实战
java·spring boot
meiying88382 小时前
多快递公司快递单号批量查询接口怎么对接?Python 聚合查询实现
java·大数据·python
古法安卓2 小时前
Android-GPU压测工具
android·java·android studio
SL_staff2 小时前
10人团队如何用轻量私有化文档平台实现知识复用提效?技术视角拆解B/S架构下的协作闭环
java·开源·全栈
释厄6233 小时前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
猫猫.1533 小时前
IO、存储、硬盘、文件系统详细总结
java·java-ee
SL_staff3 小时前
设备离线时业务不中断:JVS-IOT高可用架构解析
java·物联网·产品