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


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

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。

下面开始验证

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条。

打印结果

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

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

验证成功!

Java线程池maximumPoolSize和workQueue哪个先饱和?的更多相关文章

  1. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  2. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  3. [转 ]-- Java线程池使用说明

    Java线程池使用说明 原文地址:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1. ...

  4. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  5. Java 线程池框架核心代码分析

    前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...

  6. java线程池的使用与详解

    java线程池的使用与详解 [转载]本文转载自两篇博文:  1.Java并发编程:线程池的使用:http://www.cnblogs.com/dolphin0520/p/3932921.html   ...

  7. Java线程池使用和分析(一)

    线程池是可以控制线程创建.释放,并通过某种策略尝试复用线程去执行任务的一种管理框架,从而实现线程资源与任务之间的一种平衡. 以下分析基于 JDK1.7 以下是本文的目录大纲: 一.线程池架构 二.Th ...

  8. Java线程池使用和分析(二) - execute()原理

    相关文章目录: Java线程池使用和分析(一) Java线程池使用和分析(二) - execute()原理 execute()是 java.util.concurrent.Executor接口中唯一的 ...

  9. java线程池ThreadPoolExector源码分析

    java线程池ThreadPoolExector源码分析 今天研究了下ThreadPoolExector源码,大致上总结了以下几点跟大家分享下: 一.ThreadPoolExector几个主要变量 先 ...

  10. Java线程池带图详解

    线程池作为Java中一个重要的知识点,看了很多文章,在此以Java自带的线程池为例,记录分析一下.本文参考了Java并发编程:线程池的使用.Java线程池---addWorker方法解析.线程池.Th ...

随机推荐

  1. 阿里云EMAS旗下低代码平台Mobi开放定向内测

    ​简介:[低代码深度共创]EMAS旗下低代码平台Mobi开放定向内测名额,限时限量,参与调研先到先得! Mobi是面向全端(Web.Native App.H5.全平台小程序等)场景,模型驱动的低代码开 ...

  2. 阿里云数据库开源重磅发布:PolarDB三节点高可用的功能特性和关键技术

    ​简介:在3月2日的阿里云开源 PolarDB 企业级架构发布会上,阿里云数据库技术专家孟勃荣 带来了主题为<PolarDB 三节点高可用>的精彩演讲.三节点高可用功能主要为 PolarD ...

  3. Hologres揭秘:高性能原生加速MaxCompute核心原理

    简介: Hologres技术揭秘系列持续更新中,本期我们将带来Hologres高性能原生加速查询MaxCompute的技术原理解析. Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓, ...

  4. MaxCompute非事务表如何更新数据

    简介: 本文主要讲解如何通过insert overwrite更新数据 背景 对于大数据中的大多数存储格式,支持随机更新非常复杂.它需要扫描大型文件,MaxCompute推出了最新的功能Transact ...

  5. [GPT] 如何让 vue-router 打开新窗口

      在Vue Router中打开新窗口可以通过使用 <router-link> 组件的 target 属性来实现.将 target 属性设置为`"_blank"`将会在 ...

  6. 2018-2-13-win10-uwp-自定义控件-SplitViewItem

    title author date CreateTime categories win10 uwp 自定义控件 SplitViewItem lindexi 2018-2-13 17:23:3 +080 ...

  7. frp内网穿透器安装与介绍

    1.NAT访问 2.FRP介绍 中文官方文档:https://gofrp.org/docs/ github:https://github.com/fatedier/frp/releases frp 采 ...

  8. 《HelloGitHub》第 97 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  9. SAP集成技术(十)混合集成平台

    混合集成平台hybrid integration platform (有时缩写为HIP)这个术语近年来被大量使用,但很多人可能不太清楚它的概念. 内容摘录自<SAP Interface Mana ...

  10. python教程2:if...else...+循环

    一.if判断 有单分支.双分支.多分支,下面就是一个多分支的案例: 二.缩进 三.for循环 四.while循环  五.其他 random模块  string模块