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


    你们知道,“当任务数超过线程池的核心线程数时,如何让它不进入队列,而是直接启用最大线程数”吗?

    大家好,我是Mic,一个工作了14年的Java程序员。

    刚刚这个问题是一个工作5年的粉丝最近去某互联网公司面试遇到的。

    关于这个问题,我把高手的回答整理到了一个15W字的面试文档里面。

    大家可以扫描文章尾端二维码领取

    下面看看高手的回答

    大家记得点赞收藏加关注

    需要高手面试文档面试文档的小伙伴可以扫描文章底部二维码

    高手:

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

    • 第一步,预热核心线程

    • 第二步,把任务添加到阻塞队列

    • 第三步,如果添加到阻塞队列失败,则创建非核心线程增加处理效率

    • 第四步,如果非核心线程数达到了阈值,就触发拒绝策略

    所以,如果希望这个任务不进入队列,那么只需要去影响第二步的执行逻辑就行了。

    Java中线程池提供的构造方法里面,有一个参数可以修改阻塞队列的类型。

    其中,就有一个阻塞队列叫SynchronousQueue, 这个队列不能存储任何元素。

    它的特性是,每生产一个任务,就必须要指派一个消费者来处理,否则就会阻塞生产者。

    基于这个特性,只要把线程池的阻塞队列替换成SynchronousQueue。

    就能够避免任务进入到阻塞队列,而是直接启动最大线程数去处理这个任务。

    总结

    这个问题考察的角度其实挺有意思。

    它能筛选掉很多靠背面试题去准备面试的同学。

    但凡你了解过线程池的工作原理以及阅读过源码

    你都能轻易的回答出来。

    另外,我将所有Java面试系列制作成了完整的面试文档。它的便捷之处在于,可以通过检索的方式,找到你想要的面试题,目前已经更新180期,总计超过15W字!

    【想领取面试文档的小伙伴可以点击文章底部名片无套路免费赠送给大家!】

    需要高手面试文档面试文档的小伙伴可以扫描下方二维码
    ↓↓↓↓↓↓↓↓↓↓↓↓↓

  • 相关阅读:
    代码随想录刷题|LeetCode 1049. 最后一块石头的重量II 494. 目标和 474.一和零
    多维时序 | MATLAB实现PSO-GRU-Attention粒子群优化门控循环单元融合注意力机制的多变量时间序列预测
    AI人工智能Mojo语言:AI的新编程语言
    【Qt】Qt定时器类QTimer
    【Java 进阶篇】JDBC 管理事务详解
    数字化工厂建设方案探讨
    从0开始python学习-26.selenium 强制等待、显示等待、隐式等待
    create-react-app v5 打包配置(部署到非根目录)
    软件概要设计-架构真题(二十五)
    linux中的vim工具
  • 原文地址:https://blog.csdn.net/q331464542/article/details/126525002