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

请求超过Spring线程池的最大线程(处理逻辑)

问:

如果同时发出了100个异步请求,超过了能处理的最大线程,线程池的工作机制是怎么样的呢?

线程池大小:

<bean id="taskExecutor"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><property name="corePoolSize" value="5" /><property name="maxPoolSize" value="10" /><property name="queueCapacity" value="50" /><property name="keepAliveSeconds" value="60" /><property name="threadNamePrefix" value="ssh-thread-" /><property name="rejectedExecutionHandler"><beanclass="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" /></property></bean><task:annotation-driven executor="taskExecutor"/>
  1. 核心线程处理
    前5个请求会立即由核心线程(corePoolSize=5)执行,此时活跃线程数达到核心线程数上限。

  2. 队列缓冲
    接下来的50个请求(queueCapacity=50)会被放入工作队列等待执行,此时队列满负荷。

  3. 扩展线程处理
    当队列满后,线程池会创建新线程处理后续请求,直到线程总数达到maxPoolSize=10。此时会再处理5个请求(10-5=5),总处理量为:5(核心) + 5(扩展) = 10个并发执行任务。

  4. 拒绝策略触发(注1)
    剩余40个请求(100-5-50-5)将触发CallerRunsPolicy策略,由提交任务的调用线程(如HTTP请求的Tomcat线程)同步执行这些任务,导致调用方阻塞。

关键指标总结

  • 并发执行线程数:10(maxPoolSize)
  • 队列堆积任务数:50(queueCapacity)
  • 同步降级任务数:40(CallerRunsPolicy处理)
  • 线程空闲回收:非核心线程60秒(keepAliveSeconds)后自动销毁。

注1:什么是拒绝策略

通俗解释线程池的CallerRunsPolicy策略

当线程池(比如你配置的5核心线程+10最大线程+50队列)被100个任务同时塞满时,会发生以下情况:

  1. 前5个任务‌:直接由5个核心线程处理(像5个固定工人开工)。
  2. 接下来的50个任务‌:排队等待(像把任务扔进一个能装50个任务的篮子)。
  3. 再接下来的5个任务‌:临时再招5个工人(总工人数达到10个上限)。
  4. 最后40个任务‌:
    • 因为工人和篮子都满了,线程池会喊:“‌谁提交的任务谁自己干!‌”
    • 比如Tomcat线程(处理HTTP请求的线程)会被迫停下当前工作,直接去执行这40个任务,导致网页响应变慢甚至卡死‌。

类比‌:
想象餐厅只有10个厨师(线程),50个待做菜的订单(队列)。突然来了100个订单:

  • 前10个厨师先做10个菜(5个固定厨师+5个临时工)。

  • 50个订单排队等。

  • 剩下的40个订单?老板(调用线程)只能亲自下厨,结果顾客(用户)等更久了‌。

关键点‌:

  • 这种策略能保证任务不丢失,但会拖慢提交任务的线程(比如网页响应变慢)。
  • 适合对任务完整性要求高,但能接受短暂延迟的场景‌

文章转载自:

http://50OlhOAW.sxbgc.cn
http://jOpsebFy.sxbgc.cn
http://zqii3s1z.sxbgc.cn
http://u2A9Utbd.sxbgc.cn
http://QDwwCpX0.sxbgc.cn
http://0qjv3TaF.sxbgc.cn
http://xvJjikuF.sxbgc.cn
http://OeeDH6i7.sxbgc.cn
http://vXKdflzP.sxbgc.cn
http://1rPVDBM1.sxbgc.cn
http://IytoSukm.sxbgc.cn
http://nvFJppvt.sxbgc.cn
http://Qrl0LYcH.sxbgc.cn
http://4ONRrE4d.sxbgc.cn
http://B8W7MbgP.sxbgc.cn
http://H2Yau4aL.sxbgc.cn
http://oAx4MOMd.sxbgc.cn
http://J12l3g5H.sxbgc.cn
http://UNY8J5Y3.sxbgc.cn
http://nqCEkC5H.sxbgc.cn
http://pIZydg7N.sxbgc.cn
http://BPb6SOPR.sxbgc.cn
http://EWHwSVbG.sxbgc.cn
http://egAxq3Ea.sxbgc.cn
http://JX4aCYip.sxbgc.cn
http://698DWC0L.sxbgc.cn
http://KgbtC32F.sxbgc.cn
http://7LPmflsH.sxbgc.cn
http://z8TFNaTD.sxbgc.cn
http://3pNn92tj.sxbgc.cn
http://www.dtcms.com/a/368832.html

相关文章:

  • 使用buildroot交叉编译swupdate 记录
  • PyTorch 中的循环神经网络 (RNN/LSTM):时序数据处理实战指南
  • Preprocessing Model in MPC 7 - Matrix Triples and Convolutions Lookup Tables
  • 职场突围:我的转岗反思录
  • Nature Electronics 用于解码疲劳水平的眼睑软体磁弹性传感器
  • 【AI产品思路】AI 原型设计工具横评:产品经理视角下的 v0、Bolt 与 Lovable
  • 如何使用宝塔API批量操作Windows目录文件:从获取文件列表到删除文件的完整示例
  • 极大似然估计与概率图模型:统计建模的黄金组合
  • K8S删除命名空间卡住一直Terminating状态
  • 【清爽加速】Windows 11 Pro 24H2-Emmy精简系统
  • Overleaf教程+Latex教程
  • 获取DLL动态库的版本信息(dumpbin.exe)
  • AI时代企业获取精准流量与实现增长的GEO新引擎
  • 基于单片机老人居家环境健康检测/身体健康检测设计
  • Qt---字节数据处理QByteArray
  • 无字母数字命令执行
  • nestjs 缓存配置及防抖拦截器
  • 高等数学知识补充:三角函数
  • 论文Review Registration VGICP | ICRA2021 | 经典VGICP论文
  • 遇到 Git 提示大文件无法上传确实让人头疼
  • 基于单片机雏鸡家禽孵化系统/孵化环境监测设计
  • Docling将pdf转markdown以及与AI生态集成
  • GD32入门到实战35--485实现OTA
  • 别再看人形机器人了!真正干活的机器人还有这些!
  • C++编程——异步处理、事件驱动编程和策略模式
  • 【分享】AgileTC测试用例管理平台使用分享
  • cargs: 一个轻量级跨平台命令行参数解析库
  • 高级 ACL 有多强?一个规则搞定 “IP + 端口 + 协议” 三重过滤
  • 人大金仓:创建数据库分区
  • 【大数据专栏】大数据框架-Apache Druid Overview