• 【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?


    欢迎关注Java面试系列,不定期更新面试小短文。欢迎一键三连!

    当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?

    当我们提交一个任务到线程池,它的工作原理如下:

    1. 预热核心线程

    如果线程池的线程数小于corePoolSize(核心线程阈值),即使其他核心线程处于空闲状态,也会创建一个新核心线程来运行新任务。

    1. 把任务添加到阻塞队列

    如果线程池的线程数大于等于corePoolSize但少于maxPoolSize(最大线程数阈值),则将任务放入阻塞队列

    1. 如果添加阻塞队列失败,这时会创建一个非核心线程来增加处理效率

    如果阻塞队列已满,并且线程池的线程数小于maxPoolSize,则创建一个新非核心线程来运行任务。

    1. 如果非核心线程数量达到阈值,就会触发一个拒绝策略

    如果阻塞队列已满,并且线程数大于或等于maxPoolSize,则拒绝该任务。

    所以如果我们希望这个任务不进入到阻塞队列,那么只需要处理第二步就好。

    Java线程池里,它的构造方法里有一个参数可以去修改阻塞队列的类型

      其中有一个阻塞队列叫SynchronousQueue,这个队列是不能存储任何元素的阻塞队列,它的特性是每生产一个任务就必须指派一个消费者来处理这个任务,否则就会阻塞生产者。

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


    欢迎一键三连~

    有问题请留言,大家一起探讨学习

    ----------------------Talk is cheap, show me the code-----------------------
  • 相关阅读:
    【C语言入门数据结构3】链表之单链表
    了解Ajax(第一天)
    2-硼酸三苯胺,CAS号:934169-37-6
    pytorch中transform库中常用的函数有哪些及其用法?
    Seata总结
    紫光恒越:连接型CRM+灵活PaaS能力, 支撑业务快速增长
    Qt Designer生成ui文件,如何转py文件,如何运行
    SwiftUI SQLite数据库存储使用教程大合集(2022年版)
    解决win10因为WSL问题无法正常启动docker
    为什么你使用程序化自动交易接口没有赚到钱?
  • 原文地址:https://blog.csdn.net/qq_34115899/article/details/126389595