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条。下面验证推测

验证成功!

相关推荐
淼淼76310 分钟前
安装jdk1.8
java·开发语言
毕设源码-朱学姐30 分钟前
【开题答辩全过程】以 高校食堂餐饮管理系统的设计与实现为例,包含答辩的问题和答案
java
过期动态33 分钟前
Java开发中的@EnableWebMvc注解和WebMvcConfigurer接口
java·开发语言·spring boot·spring·tomcat·maven·idea
摇滚侠34 分钟前
IDEA 定义返回值快捷键
java·ide·intellij-idea
毕设源码-郭学长36 分钟前
【开题答辩全过程】以 高校考勤管理系统为例,包含答辩的问题和答案
java·eclipse
A懿轩A1 小时前
【Maven 构建工具】从零到上手 Maven:安装配置 + IDEA 集成 + 第一个项目(保姆级教程)
java·maven·intellij-idea
野犬寒鸦1 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈1 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
XiaoFan0122 小时前
将有向工作流图转为结构树的实现
java·数据结构·决策树
小突突突2 小时前
浅谈Java中的反射
java·开发语言