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

请求超过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://www.xdnf.cn/news/20177.html

相关文章:

  • 企业级项目管理方法设计指南
  • Scikit-learn Python机器学习 - 特征预处理 - 标准化 (Standardization):StandardScaler
  • 音视频面试题集锦第 38 期
  • 电影级文字生视频核心代码手册
  • CASToR 生成的文件进行转换
  • 1.数据库介绍
  • java面试:有了解过数据库事务吗,能详细讲一讲么
  • 四川地区燃气从业人员考试题库及答案
  • Redis中的hash数据类型
  • 在LangChain中无缝接入MCP服务器扩展AI智能体能力
  • 从零开始的云计算生活——第五十九天,基于Jenkins自动打包并部署Tomcat环境
  • 浅析多模态标注对大模型应用落地的重要性与标注实例
  • 图像的几种成像方式简介
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十六)windows平台运行时隐藏控制台
  • 手把手教你用Go打造带可视化的网络爬虫
  • Day36 IO多路复用技术
  • Docker Desktop 安装 wsl问题
  • android 四大组件—Activity源码详解
  • 沪深300股指期权包含上证50期权吗?
  • Chatwith:定制你的AI 聊天机器人
  • 如何从chrome中获取会话id
  • 三坐标测量机在汽车制造行业中的应用
  • 用得更顺手的 Protobuf 文件后缀、流式多消息、大数据集与“自描述消息”实战
  • 禁毒教育展厅互动设备-禁毒教育基地-禁毒体验馆方案-VR禁毒教育软件
  • 设计模式从入门到精通之(六)策略模式
  • 资源管理-dd命令
  • 《嵌入式硬件(三):串口通信》
  • Jenkins 监控方案:Prometheus + Grafana 实践
  • Java 学习笔记(进阶篇2)
  • 《Cocos Creator的2D、3D渲染使用记录》