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

线程池工作原理

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

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

SynchronousQueue

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

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

相关推荐
IVVi0jToe3 分钟前
高效C++线程池设计与实现
java·c++·安全
^yi8 分钟前
【C++】内存管理
开发语言·c++
AC赳赳老秦15 分钟前
采购专员自动化:OpenClaw 自动比价、生成询价单、跟踪供应商报价进度实战指南
开发语言·数据库·人工智能·python·自动化·github·openclaw
QiLinkOS15 分钟前
QiLink OS的失败数据共享平台的运作模式是否适用于所有行业?
android·开发语言·人工智能·算法·重构·开源
CRMEB定制开发19 分钟前
企业级Java电商系统选型路线图:从零到上线全流程拆解
java·开发语言·商城系统·小程序商城
Zhou14113620 分钟前
Java常见面试题3
java·开发语言
云栖梦泽27 分钟前
从 IMX415 摄像头驱动理解 Media Controller 框架
linux·开发语言·c++·嵌入式硬件
Solis28 分钟前
百万并发的点赞计数,我们为什么要把“事实“和“计数“拆开?
java·架构
tachibana234 分钟前
hot100 排序链表(148)
java·数据结构·算法·leetcode·链表
初阳78536 分钟前
【Qt】界面优化(1)——QSS
开发语言·qt