当前位置: 首页 > news >正文

线程池RejectedExecutionException异常

文章目录

  • 1、报错
  • 2、定位
  • 3、修复
  • 4、线程池使用的一点思考

1、报错

检索项目日志时,发现一个异常堆栈信息,核心报错:

java.util.concurrent.RejectedExecutionException: 
Task java.util.concurrent.CompletableFuture$AsyncSupply@480a10c7 
rejected from java.util.concurrent.ThreadPoolExecutor@51313448
[Running, pool size = 32, active threads = 32, queued tasks = 200, completed tasks = 2487]
// ...

关键字:RejectedExecutionException,从这个异常可以看出,这是因为往线程池提交的任务数量超过了最大线程数 + 阻塞队列长度,然后任务再提交过来,线程池无法再接收新的任务,走了默认的拒绝策略 AbortPoligy:直接抛出RejectedExecutionExption异常阻止系统正常运行

2、定位

查看堆栈信息里的信息,定位到异常代码出自:

@Service
public class InspectionService {private static final Logger log = LoggerFactory.getLogger(InspectionService.class);private final ExecutorService pool = new ThreadPoolExecutor(16,		// 常驻线程数量32,		// 最大线程数量10,		// 线程存活时间,线程多长时间没被使用就关闭TimeUnit.SECONDS,	// 上一个参数的单位new LinkedBlockingQueue<>(200),		// 阻塞队列new ThreadFactoryBuilder().setNameFormat("InspectionService-%d").build(),	// 线程工厂对象new ThreadPoolExecutor.AbortPolicy()		// 拒绝策略);
// ....

再下面CompleteableFuture再提交任务到线程池:

CompletableFuture.supplyAsync(() -> service.queryGroupInfo(), pool)
//....

提交速度 >> 线程池处理速度

3、修复

调大了阻塞队列的长度:

private final ExecutorService pool = new ThreadPoolExecutor(16,32,10,TimeUnit.SECONDS,// groupInfos.size < 500, 这里取length * 1.5new LinkedBlockingQueue<>(700),new ThreadFactoryBuilder().setNameFormat("InspectionService-%d").build(),new ThreadPoolExecutor.AbortPolicy()
);

4、线程池使用的一点思考

  • 线程池自己定义,JDK中静态方法创建的阻塞队列长度为Long.MAX_VALUE,风险很高
参数设置要点示例
corePoolSizeCPU密集型:N+1(N=CPU核数)IO密集型:2N8核服务器:CPU密集型设9,IO密集型设16
maximumPoolSize不超过系统最大线程数(cat /proc/sys/kernel/threads-max)通常设置 coreSize 的 2-4 倍
blockQueue有界队列!无界队列=内存炸弹new LinkedBlockingQueue<>(200)
keepAliveTime线程空闲回收时间(建议30-60秒)TimeUnit.SECONDS + 10
  • 线程池中的线程带名字,不要用默认的pool-xxx,出现问题不好定位是哪儿的任务
  • 可以加必要监控,采集日志分析,到达阈值时告警处理
// 定时采集关键指标(每30秒)
// 单例调度线程池ScheduledExecutorService monitor = Executors.newSingleThreadScheduledExecutor();monitor.scheduleAtFixedRate(() -> {if (pool instanceof ThreadPoolExecutor executor) {int activeCount = executor.getActiveCount();int queueSize = executor.getQueue().size();long completedTaskCount = executor.getCompletedTaskCount();log.info("线程池状态:活跃线程:{} 队列堆积:{} 完成数:{}", activeCount, queueSize, completedTaskCount);if (queueSize > 500) {log.warn("线程池队列堆积过多,队列堆积:{} 完成数:{}", queueSize, completedTaskCount);}}}, 0, 30, TimeUnit.SECONDS);}

在这里插入图片描述

  • 核心业务与非核心业务使用独立线程池,做到资源隔离

文章转载自:

http://Bd5DEENd.pwppk.cn
http://tZALqAvu.pwppk.cn
http://glz6Iv57.pwppk.cn
http://fK3R1Zkn.pwppk.cn
http://T3T4tC0j.pwppk.cn
http://L8UTQv6M.pwppk.cn
http://xuD30I2o.pwppk.cn
http://7l9DiMPU.pwppk.cn
http://IfOToxUH.pwppk.cn
http://rgzu5YYu.pwppk.cn
http://HuH7ugze.pwppk.cn
http://bkCnXqxZ.pwppk.cn
http://0RcZOEj5.pwppk.cn
http://HQSYLDJv.pwppk.cn
http://9z5OKWsE.pwppk.cn
http://CepitUEj.pwppk.cn
http://uio9TuZW.pwppk.cn
http://l2ViwqnX.pwppk.cn
http://yixwUABS.pwppk.cn
http://UhH7M5SS.pwppk.cn
http://BtUVbpYq.pwppk.cn
http://kuaeYZQO.pwppk.cn
http://1KXgsCzQ.pwppk.cn
http://Tv91YkHY.pwppk.cn
http://uG3wFmIh.pwppk.cn
http://uyzMKtuR.pwppk.cn
http://ilWTu7Sr.pwppk.cn
http://tDftcMHB.pwppk.cn
http://bJ24yfYw.pwppk.cn
http://HSaxE9iV.pwppk.cn
http://www.dtcms.com/a/229351.html

相关文章:

  • 用 PyQt5 打造一个可视化 JSON 数据解析工具
  • Playwright 多浏览器并行测试与数据隔离实战指南
  • 【算法设计与分析】实验——汽车加油问题, 删数问题(算法实现:代码,测试用例,结果分析,算法思路分析,总结)
  • ARM架构推理Stable Diffusiond
  • Foundation Models for Generalist Geospatial Artificial Intelligence(NASA发布Prithvi)论文阅读
  • 【运维】统信UOS操作系统aarch64自制OpenSSH 9.6p1 rpm包(含ssh-copy-id命令)修复漏洞
  • OD 算法题 B卷【代码编辑器】
  • Flotherm软件许可与硬件要求
  • 【复习】软件测试
  • RTOS:初始化新任务(含源码复杂点解读)
  • unity UI Canvas“高”性能写法
  • Unity-UI组件详解
  • 【mysql】BIGINT UNSIGNED字段被表示为float科学计数法 丢失精度问题
  • C++初赛的三讲
  • Java详解LeetCode 热题 100(25):LeetCode 141. 环形链表(Linked List Cycle)详解
  • web第八次课后作业--分层解耦
  • PS教程-萌新系统入门课课程视频+素材
  • String 学习总结
  • 力扣刷题 -- 232. 用栈实现队列
  • Android系统进程优先级
  • 组相对策略优化(GRPO):原理及源码解析
  • UE5 2D角色PaperZD插件动画状态机学习笔记
  • 支持TypeScript并打包为ESM/CommonJS/UMD三种格式的脚手架项目
  • 【python】三元图绘制(详细注释)
  • javascript 实战案例 二级联动下拉选框
  • 杭州白塔岭画室怎么样?和燕壹画室哪个好?
  • 6.RV1126-OPENCV 形态学基础膨胀及腐蚀
  • Spring Boot整合Druid与Dynamic-Datasource多数据源配置:从错误到完美解决
  • 1. 引言
  • SQL注入漏洞-上篇