ThreadPoolExecutor 详解
一、ThreadPoolExecutor 核心参数
构造函数如下:
public ThreadPoolExecutor(int corePoolSize, // 核心线程数int maximumPoolSize, // 最大线程数long keepAliveTime, // 非核心线程空闲存活时间TimeUnit unit, // 存活时间单位BlockingQueue<Runnable> workQueue, // 任务队列RejectedExecutionHandler handler // 拒绝策略 )
参数解析
1、corePoolSize
核心线程数:线程池中始终保持存活的线程数量(即使空闲)。 默认情况下,核心线程不会自动销毁(除非设置 allowCoreThreadTimeOut(true))。
2、maximumPoolSize
最大线程数:线程池允许创建的最大线程数量。 当任务队列已满且当前线程数小于 maximumPoolSize 时,会创建新线程。
3、keepAliveTime
非核心线程的空闲存活时间:当线程数超过 corePoolSize 时,空闲线程在销毁前的等待时间。
4、workQueue任务队列:
用于存储等待执行的任务。常用队列类型: LinkedBlockingQueue:无界队列(默认容量为 Integer.MAX_VALUE)。 ArrayBlockingQueue:有界队列(需指定容量)。 SynchronousQueue:直接传递队列(不存储任务,任务直接交给线程处理)。
5、handler
拒绝策略:当任务队列已满且线程数达到 maximumPoolSize 时,处理新提交的任务。 内置策略:AbortPolicy(默认):抛出 RejectedExecutionException。CallerRunsPolicy:由提交任务的线程直接执行该任务。DiscardPolicy:静默丢弃任务。DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新提交当前任务。
二、任务执行流程
1. 提交任务后,若当前线程数 < corePoolSize,则创建新线程执行任务。 2.若线程数 ≥ corePoolSize,任务会被放入任务队列。 3.若队列已满且线程数 < maximumPoolSize,则创建新线程执行任务。 4.若队列已满且线程数 ≥ maximumPoolSize,触发拒绝策略。
三、代码示例
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, // corePoolSize5, // maximumPoolSize60, TimeUnit.SECONDS, // keepAliveTimenew ArrayBlockingQueue<>(10), // 容量为 10 的有界队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);// 提交任务
for (int i = 0; i < 20; i++) {executor.execute(() -> {System.out.println("Task executed by " + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}});
}// 关闭线程池
executor.shutdown();
四、常见面试题
1. 线程池的工作流程是什么?
核心线程是否已满 → 任务是否入队 → 队列是否已满 → 是否创建非核心线程 → 是否触发拒绝策略。
2. corePoolSize 和 maximumPoolSize 的区别?
corePoolSize 是常驻线程数,maximumPoolSize 是线程池的容量上限。
3. 为什么推荐手动创建线程池,而不是用 Executors 的工厂方法?
Executors 提供的默认线程池(如 newFixedThreadPool、newCachedThreadPool)可能隐藏风险: newFixedThreadPool 使用无界队列,可能堆积大量任务导致 OOM。 newCachedThreadPool 允许无限创建线程,可能导致线程数爆炸。
4. 任务队列的选择对线程池的影响?
无界队列(如 LinkedBlockingQueue):可能导致任务堆积,最终 OOM。 有界队列(如 ArrayBlockingQueue):需合理设置队列容量,避免频繁触发拒绝策略。 直接传递队列(SynchronousQueue):任务不存储,直接交给线程处理,适合高吞吐场景。
5. 拒绝策略有哪些?实际项目中如何选择?
AbortPolicy:适合严格要求任务完整性的场景(如支付交易)。 CallerRunsPolicy:适合允许任务延迟但必须完成的场景(如日志记录)。 DiscardOldestPolicy:适合允许丢弃旧任务的场景(如实时数据流)。
6. 如何合理设置线程池参数?
CPU 密集型任务:corePoolSize = CPU 核心数 + 1(避免过多线程竞争 CPU)。 IO 密集型任务:corePoolSize = 2 * CPU 核心数(充分利用线程等待 IO 的时间)。
7. 线程池的关闭方法 shutdown() 和 shutdownNow() 的区别?
shutdown():平缓关闭,不再接受新任务,但会执行完队列中的任务。 shutdownNow():立即关闭,尝试中断正在执行的任务,并清空队列。
8. 如何监控线程池状态?
通过 ThreadPoolExecutor 提供的方法: getActiveCount():当前活动线程数。 getQueue().size():队列中等待的任务数。 getCompletedTaskCount():已完成的任务数。
五、使用注意事项
避免无界队列:防止任务堆积导致内存溢出。合理设置线程存活时间:避免频繁创建/销毁线程的开销。自定义拒绝策略:根据业务需求处理无法执行的任务。关闭线程池:确保程序退出时释放资源。
六、corePoolSize、maximumPoolSize、workQueue关系代码演示
七、拒绝策略代码演示
作为程序员,持续学习和充电非常重要,作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。低代码也是一个值得我们深入探索的领域,让我们拭目以待,它将给前端世界带来怎样的变革,推荐一个低代码工具。
应用地址: https://www.jnpfsoft.com
开发语言:Java/.net
这是一个基于Flowable引擎(支持java、.NET),已支持MySQL、SqlServer、Oracle、PostgreSQL、DM(达梦)、 KingbaseES(人大金仓)6个数据库,支持私有化部署,前后端封装了上千个常用类,方便扩展,框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用。
相关文章:
ThreadPoolExecutor 详解
一、ThreadPoolExecutor 核心参数 构造函数如下: public ThreadPoolExecutor(int corePoolSize, // 核心线程数int maximumPoolSize, // 最大线程数long keepAliveTime, // 非核心线程空闲存活时间TimeUnit unit, // 存活时间单位BlockingQueue…...
TikTok走红全球:中国短视频平台以全新姿态登陆海外市场
在数字化浪潮中,短视频已经成为全球年轻人表达自我、分享生活的重要方式。TikTok,这个起源于中国的短视频平台,以其独特的魅力和创新的功能在全球范围内迅速走红。本文将探讨TikTok如何以全新姿态登陆海外市场,并分析其成功的关键…...
Qt的QTableWidget样式设置
在 Qt 中,可以通过样式表(QSS)为 QTableWidget 设置各种样式。以下是一些常见的样式设置示例: 1. 基本样式设置 tableWidget->setStyleSheet(// 表格整体样式"QTableWidget {"" background-color: #F0F0F0;…...
计算机毕业设计Python旅游评论情感分析 NLP情感分析 LDA主题分析 bayes分类 旅游爬虫 旅游景点评论爬虫 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
渗透测试扫描器全解析:分类与介绍
目录 前言 操作系统扫描器:系统漏洞的 “侦察兵” 特点 代表性工具 网站 Web 漏洞扫描器:Web 应用的 “安全卫士” 特点 代表性工具 手机漏洞扫描器:移动设备的 “安全护盾” 特点 代表性工具 前言 在数字技术飞速发展的当下&…...
day9手机创意软件
趣味类 in:记录趣味生活(通用) 魔漫相机:真人变漫画(通用) 活照片:让照片活过来(通用) 画中画相机:与众不同的艺术 年龄检测仪:比一比谁更年轻…...
A001基于SpringBoot实现的小区物业管理系统
系统介绍 基于SpringBoot实现的小区物业管理系统是为物业管理打造的一款在线管理平台,它可以实时完成信息处理,对小区信息、住户等进行在线管理,使其系统化和规范化。 系统功能说明 1、系统共有物业、业主角色,物业拥有系统最高…...
【Uniapp】关于实现下拉刷新的三种方式
在小程序、h5等地方中,常常会用到下拉刷新这个功能,今天来讲解实现这个功能的三种方式:全局下拉刷新,组件局部下拉刷新,嵌套组件下拉刷新。 全局下拉刷新 这个方式简单,性能佳,最推荐…...
常见的 Web 攻击方式有哪些,如何防御?
一、XSS攻击(跨站脚本攻击) 攻击原理:恶意脚本通过用户输入注入页面,分为存储型(数据库持久化)、反射型(URL参数注入)、DOM型(客户端脚本修改) 防御方案&am…...
深入理解DeepSeek与企业实践(二):32B多卡推理的原理、硬件散热与性能实测
前言 在《深入理解 DeepSeek 与企业实践(一):蒸馏、部署与评测》文章中,我们详细介绍了深度模型的蒸馏、量化技术,以及 7B 模型的部署基础,通常单张 GPU 显存即可满足7B模型完整参数的运行需求。然而&…...
数据结构-链式二叉树
文章目录 一、链式二叉树1.1 链式二叉树的创建1.2 根、左子树、右子树1.3 二叉树的前中后序遍历1.3.1前(先)序遍历1.3.2中序遍历1.3.3后序遍历 1.4 二叉树的节点个数1.5 二叉树的叶子结点个数1.6 第K层节点个数1.7 二叉树的高度1.8 查找指定的值(val)1.9 二叉树的销毁 二、层序…...
【云安全】云原生- K8S etcd 未授权访问
什么是etcd? etcd 是一个开源的分布式键值存储系统,主要用于存储和管理配置信息、状态数据以及服务发现信息。它采用 Raft 共识算法,确保数据的一致性和高可用性,能够在多个节点上运行,保证在部分节点故障时仍能继续提…...
AI时代的前端开发:对抗压力的利器
在飞速发展的AI时代,前端开发工程师们面临着前所未有的挑战。项目周期不断缩短,需求变化日新月异,交付压力更是与日俱增,这使得开发人员承受着巨大的压力。如何提升对抗压能力,成为摆在每一位前端工程师面前的重要课题…...
在npm上传属于自己的包
前言 最近在整理代码,上传到npm方便使用,所以学习了如何在npm发布一个包,整理写成一篇文章和大家一起交流。 修改记录 更新内容更新时间文章第一版25.2.10新增“使用包”,“删除包的测试”25.2.12 1、注册npm账号 npm | Home 2…...
[Spring] Spring常见面试题
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
适配器模式详解(Java)
一、引言 1.1 定义与类型 适配器模式是一种结构型设计模式,主要目的是将一个类的接口转换为客户期望的另一个接口。这种模式使得原本因为接口不匹配而不能一起工作的类可以一起工作,从而提高了类的复用性。适配器模式分为类适配器和对象适配器两种类型。类适配器使用继承关…...
22.4、Web应用漏洞分析与防护
目录 Web应用安全概述DWASP Top 10Web应用漏洞防护 - 跨站脚本攻击XSSWeb应用漏洞防护 - SQL注入Web应用漏洞防护 - 文件上传漏洞Web应用漏洞防护 - 跨站脚本攻击XSS Web应用安全概述 技术安全漏洞,主要是因为技术处理不当而产生的安全隐患,比如SQL注入…...
【Pandas】pandas Series drop
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...
SpringBoot实战:高效获取视频资源
文章目录 前言技术实现SpringBoot项目构建产品选取配置数据采集 号外号外 前言 在短视频行业高速发展的背景下,海量内容数据日益增长,每天都有新的视频、评论、点赞、分享等数据涌现。如何高效、精准地获取并处理这些庞大的数据,已成为各大平…...
mysql大数据量分页查询
一、什么是MySQL大数据量分页查? MySQL大数据量分页查是指在使用MySQL数据库时,将大量数据分成多个较小的部分进行显示,以提高查询效率和用户体验。分页查询通常用于网页或应用程序中,以便用户能够逐步浏览结果集。 二、为什…...
迅为RK3568开发板篇OpenHarmony实操HDF驱动配置LED-LED测试
将编译好的镜像全部进行烧写,镜像在源码根目录 out/rk3568/packages/phone/images/目录下。 烧写完成之后,在调试串口查看打印日志,如下图所示: 然后打开 hdc 工具,运行测试程序,输入“led_test 1”&…...
OpenGL ES -> 投影变换矩阵完美解决绘制GLSurfaceView绘制图形拉伸问题
GLSurfaceView绘制图形拉伸问题 假如在XML文件中声明GLSurfaceView的宽高为 android:layout_width"match_parent"android:layout_height"match_parent GLSurfaceView绘制的图形在Open GL ES坐标系中,而Open GL ES坐标系会根据GLSurfaceView的宽高将…...
玩转大语言模型——使用Kiln AI可视化环境进行大语言模型微调数据合成
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——三分钟教你用langchain提示词工程获得猫娘女友 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型—…...
图书管理项目(spring boot + Vue)
想要该项目的话,就 jia 我,并在评论区给我说一下,只需要1元,我把整个项目发给你 jia微:18439421203(名字叫:Bingo) 运行图片:...
【机器学习】简单线性回归算法及代码实现
线性回归算法 一、摘要二、线性回归算法概述三、损失函数的定义和衡量标准四、简单线性回归的求解和应用五、机器学习算法一般求解思路 一、摘要 本文讲解了线性回归算法的基础知识和应用,强调线性回归主要用于解决回归问题。通过分析房产价格与房屋面积的关系&…...
AI-大模型(3)-MoE模型
1.什么是MOE模型 多个领域专家共同工作,并行计算。 2.MOE如何工作 gate层:根据输入Token选择专家 基于Token来选择专家 Gate层选择专家 除专家外,其他层共享一个token可以选择多个专家 一个token 可以选择一个专家或者多个专…...
PySide(PyQT)使用场景(QGraphicsScene)进行动态标注的一个demo
用以标注图像的一个基本框架demo import sys from PySide6.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QMainWindow, QLabel, QGraphicsPixmapItem from PySide6.QtGui import QPixmap, QPainter, QTransform from PySide6.QtCore import Qt, QPointF, S…...
w206基于Spring Boot的农商对接系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
C++类和对象进阶:拷贝构造函数深度详解
拷贝构造函数 拷贝构造函数前言引入拷贝构造函数特征拷贝构造函数建议参数加上const 拷贝构造函数参数传值会引发无穷递归的解释内置类型传参拷贝自定义类型传参拷贝详细解释 编译器生成的默认拷贝构造函数默认构造函数做了什么?深拷贝与浅拷贝简单实现一个深拷贝。…...
docker搭建redis-cluster
两台服务器,并且想要搭建 Redis 集群。根据你的命令,Redis 集群将会运行在 Docker 容器中,而你使用的镜像是 redis-cluster:4.0,并且设定了 CLUSTER_ANNOUNCE_IP 环境变量来指定 Redis 实例的 IP 地址。 为了在两台服务器上搭建 …...
