Java concurrency线程池之线程池原理(一)_动力节点Java学院整理
发布时间 - 2026-01-11 01:51:36 点击率:次ThreadPoolExecutor简介

ThreadPoolExecutor是线程池类。对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合。线程池允许若个线程同时允许,允许同时运行的线程数量就是线程池的容量;当添加的到线程池中的线程超过它的容量时,会有一部分线程阻塞等待。线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理。"
ThreadPoolExecutor数据结构
ThreadPoolExecutor的数据结构如下图所示:
各个数据在ThreadPoolExecutor.java中的定义如下:
// 阻塞队列。 private final BlockingQueue<Runnable> workQueue; // 互斥锁 private final ReentrantLock mainLock = new ReentrantLock(); // 线程集合。一个Worker对应一个线程。 private final HashSet<Worker> workers = new HashSet<Worker>(); // “终止条件”,与“mainLock”绑定。 private final Condition termination = mainLock.newCondition(); // 线程池中线程数量曾经达到过的最大值。 private int largestPoolSize; // 已完成任务数量 private long completedTaskCount; // ThreadFactory对象,用于创建线程。 private volatile ThreadFactory threadFactory; // 拒绝策略的处理句柄。 private volatile RejectedExecutionHandler handler; // 保持线程存活时间。 private volatile long keepAliveTime; private volatile boolean allowCoreThreadTimeOut; // 核心池大小 private volatile int corePoolSize; // 最大池大小 private volatile int maximumPoolSize;
1. workers
workers是HashSet<Work>类型,即它是一个Worker集合。而一个Worker对应一个线程,也就是说线程池通过workers包含了"一个线程集合"。当Worker对应的线程池启动时,它会执行线程池中的任务;当执行完一个任务后,它会从线程池的阻塞队列中取出一个阻塞的任务来继续运行。
wokers的作用是,线程池通过它实现了"允许多个线程同时运行"。
2. workQueue
workQueue是BlockingQueue类型,即它是一个阻塞队列。当线程池中的线程数超过它的容量的时候,线程会进入阻塞队列进行阻塞等待。
通过workQueue,线程池实现了阻塞功能。
3. mainLock
mainLock是互斥锁,通过mainLock实现了对线程池的互斥访问。
4. corePoolSize和maximumPoolSize
corePoolSize是"核心池大小",maximumPoolSize是"最大池大小"。它们的作用是调整"线程池中实际运行的线程的数量"。
例如,当新任务提交给线程池时(通过execute方法)。
-- 如果此时,线程池中运行的线程数量< corePoolSize,则创建新线程来处理请求。
-- 如果此时,线程池中运行的线程数量> corePoolSize,但是却< maximumPoolSize;则仅当阻塞队列满时才创建新线程。
如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。在大多数情况下,核心池大小和最大池大小的值是在创建线程池设置的;但是,也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 进行动态更改。
5. poolSize
poolSize是当前线程池的实际大小,即线程池中任务的数量。
6. allowCoreThreadTimeOut和keepAliveTime
allowCoreThreadTimeOut表示是否允许"线程在空闲状态时,仍然能够存活";而keepAliveTime是当线程池处于空闲状态的时候,超过keepAliveTime时间之后,空闲的线程会被终止。
7. threadFactory
threadFactory是ThreadFactory对象。它是一个线程工厂类,"线程池通过ThreadFactory创建线程"。
8. handler
handler是RejectedExecutionHandler类型。它是"线程池拒绝策略"的句柄,也就是说"当某任务添加到线程池中,而线程池拒绝该任务时,线程池会通过handler进行相应的处理"。
综上所说,线程池通过workers来管理"线程集合",每个线程在启动后,会执行线程池中的任务;当一个任务执行完后,它会从线程池的阻塞队列中取出任务来继续运行。阻塞队列是管理线程池任务的队列,当添加到线程池中的任务超过线程池的容量时,该任务就会进入阻塞队列进行等待。
线程池调度
我们通过下面的图看看下面线程池中任务的调度策略,加深对线程池的理解。
图-01:
图-02:
说明:
在"图-01"中,线程池中有N个任务。"任务1", "任务2", "任务3"这3个任务在执行,而"任务3"到"任务N"在阻塞队列中等待。正在执行的任务,在workers集合中,workers集合包含3个Worker,每一个Worker对应一个Thread线程,Thread线程每次处理一个任务。
当workers集合中处理完某一个任务之后,会从阻塞队列中取出一个任务来继续执行,如图-02所示。图-02表示"任务1"处理完毕之后,线程池将"任务4"从阻塞队列中取出,放到workers中进行处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Java
# concurrency
# 线程池
# Java concurrency线程池之线程池原理(三)_动力节点Java学院整理
# Java concurrency线程池之线程池原理(二)_动力节点Java学院整理
# Java concurrency线程池之线程池原理(四)_动力节点Java学院整理
# 池中
# 它是
# 它会
# 句柄
# 数据结构
# 实现了
# 所示
# 互斥
# 也就是说
# 就会
# 是在
# 会有
# 多个
# 可以使用
# 如图
# 将它
# 设置为
# 时才
# 完成任务
# 完后
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何彻底删除建站之星生成的Banner?
Java解压缩zip - 解压缩多个文件或文件夹实例
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
开心动漫网站制作软件下载,十分开心动画为何停播?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
如何自定义建站之星模板颜色并下载新样式?
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
如何在七牛云存储上搭建网站并设置自定义域名?
PythonWeb开发入门教程_Flask快速构建Web应用
如何用AI帮你把自己的生活经历写成一个有趣的故事?
如何选择可靠的免备案建站服务器?
大同网页,大同瑞慈医院官网?
PHP 500报错的快速解决方法
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Linux系统命令中screen命令详解
如何用花生壳三步快速搭建专属网站?
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
南京网站制作费用,南京远驱官方网站?
nodejs redis 发布订阅机制封装实现方法及实例代码
如何在万网自助建站平台快速创建网站?
如何用搬瓦工VPS快速搭建个人网站?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
深圳网站制作的公司有哪些,dido官方网站?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
如何确保西部建站助手FTP传输的安全性?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
如何用好域名打造高点击率的自主建站?
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
Laravel如何优化应用性能?(缓存和优化命令)
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
JavaScript常见的五种数组去重的方式
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
深圳网站制作培训,深圳哪些招聘网站比较好?
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何快速搭建二级域名独立网站?
Laravel定时任务怎么设置_Laravel Crontab调度器配置
,交易猫的商品怎么发布到网站上去?
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
零基础网站服务器架设实战:轻量应用与域名解析配置指南
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件

