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

线程池工作原理

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

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

SynchronousQueue

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

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

相关推荐
菜鸟小九4 小时前
JUC补充(ThreadLocal、completableFuture)
java·开发语言
dyxal4 小时前
Louvain 算法:让网络自己“报团取暖”的发现者
开发语言·算法
计算机安禾5 小时前
【c++面向对象编程】第41篇:函数模板与类模板:泛型编程的基石
开发语言·c++·算法
熊猫_豆豆5 小时前
麦克斯韦方程组(电磁效应Python展示)
开发语言·python·电磁感应·麦克斯韦方程组
Seven975 小时前
两小时入门Sentinel
java
SilentSamsara5 小时前
属性查找顺序:实例 → 类 → 父类的完整 MRO
开发语言·python·算法·青少年编程
tongluowan0075 小时前
Java中atomic底层原理 - ABA 问题与解决方案
java·juc·atomic
运维行者_5 小时前
云计算连接性与互操作性
服务器·开发语言·网络·web安全·网络基础设施
郝学胜-神的一滴5 小时前
Qt 高级开发 010: 从跨界面传值到自定义信号
开发语言·c++·qt·程序人生·用户界面
社交怪人5 小时前
【浮点数相除的余】信息学奥赛一本通C语言解法(题号1029)
c语言·开发语言