当任务数超过线程池的核心线程数时,如何让它不进入队列,而是直接启用最大线程数

线程池工作原理

当我们提交一个任务到线程池的时候,它的工作原理分为四步:

  1. 第一步,预热核心线程
  2. 第二步,把任务添加到阻塞队列
  3. 第三步,如果添加到阻塞队列失败,则创建非核心线程增加处理效率
  4. 第四步,如果非核心线程数达到了阈值,就触发拒绝策略

SynchronousQueue

所以,如果希望这个任务不进入队列,那么只需要去影响第二步的执行逻辑就行了。Java 中线程池提供的构造方法里面,有一个参数可以修改阻塞队列的类型。其中,就有一个阻塞队列叫 SynchronousQueue(如图), 这个队列不能存储任何元素。它的特性是,每生产一个任务,就必须要指派一个消费者来处理,否则就会阻塞生产者。

基于这个特性,只要把线程池的阻塞队列替换成 SynchronousQueue。就能够避免任务进入到阻塞队列,而是直接启动最大线程数去处理这个任务。

相关推荐
F_D_Z19 小时前
【解决办法】网络训练报错AttributeError: module ‘jax.core‘ has no attribute ‘Shape‘.
开发语言·python·jax
chenyuhao202419 小时前
MySQL索引特性
开发语言·数据库·c++·后端·mysql
雨中飘荡的记忆19 小时前
财务对账系统设计与实现
java
laocooon52385788619 小时前
vue3 本文实现了一个Vue3折叠面板组件
开发语言·前端·javascript
0***h94219 小时前
使用 java -jar 命令启动 Spring Boot 应用时,指定特定的配置文件的几种实现方式
java·spring boot·jar
雨中飘荡的记忆19 小时前
布式事务详解:从理论到实践(RocketMQ + Seata)
java·rocketmq
i***486119 小时前
微服务生态组件之Spring Cloud LoadBalancer详解和源码分析
java·spring cloud·微服务
zzlyx9919 小时前
用C#采用Avalonia+Mapsui在离线地图上插入图片画信号扩散图
java·开发语言·c#
Aevget19 小时前
MyEclipse全新发布v2025.2——AI + Java 24 +更快的调试
java·ide·人工智能·eclipse·myeclipse
Yue丶越20 小时前
【C语言】自定义类型:结构体
c语言·开发语言