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

线程池工作原理

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

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

SynchronousQueue

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

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

相关推荐
步行cgn12 小时前
MyBatis Error evaluating expression ‘ids‘. Return value (3) was not iterable 错误详
java·后端
yujunl12 小时前
总结一下U9客开的成果
开发语言
独隅12 小时前
KMP 全栈进化:Koog 框架打造纯 Kotlin AI Agent 实战效果
开发语言·人工智能·kotlin
lhldsg13 小时前
社区健身场地规划实战指南:从器材配置到智能化管理经验分享
java·开发语言·经验分享·小程序
LayZhangStrive13 小时前
后端通识 - 后端工程开发常用的流程图类别
java·流程图·后端开发
WIN赢13 小时前
【抽象思想-从复杂中抽离简单、收敛的口子】
java·前端·javascript
captain37613 小时前
多线程单例模式
java·单例模式·java-ee
xiaotianyuanma14 小时前
【计算机毕业设计】基于Spring Boot的体育馆预约系统的设计与实现
java·spring boot·课程设计
何以解忧,唯有..14 小时前
MySQL 索引分类与底层原理深度剖析
java
SomeB1oody14 小时前
【RustyML入门】5.0. 模型评估
开发语言·后端·机器学习·rust·教程