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

问:

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

线程池大小:

XML 复制代码
<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">
			<bean
				class="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个订单?老板(调用线程)只能亲自下厨,结果顾客(用户)等更久了‌。

关键点‌:

  • 这种策略能保证任务不丢失,但会拖慢提交任务的线程(比如网页响应变慢)。
  • 适合对任务完整性要求高,但能接受短暂延迟的场景‌
相关推荐
qianshang23321 小时前
SQL注入学习总结
网络·数据库·渗透
what丶k21 小时前
深入解析Redis数据持久化:RBD机制原理、实操与生产最佳实践
数据库·redis·缓存
瀚高PG实验室1 天前
通过数据库日志获取数据库中的慢SQL
数据库·sql·瀚高数据库
Hgfdsaqwr1 天前
Python在2024年的主要趋势与发展方向
jvm·数据库·python
invicinble1 天前
对于Mysql深入理解
数据库·mysql
jmxwzy1 天前
Spring全家桶
java·spring·rpc
阳光九叶草LXGZXJ1 天前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
Hgfdsaqwr1 天前
掌握Python魔法方法(Magic Methods)
jvm·数据库·python
s1hiyu1 天前
使用Scrapy框架构建分布式爬虫
jvm·数据库·python
2301_763472461 天前
使用Seaborn绘制统计图形:更美更简单
jvm·数据库·python