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

Posted 砖业洋__

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?相关的知识,希望对你有一定的参考价值。

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

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

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

  1. 预热核心线程

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

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

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

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

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

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

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

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

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

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

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


欢迎一键三连~

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

----------------------Talk is cheap, show me the code-----------------------

以上是关于Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Java线程池的配置

线程池参数与线程池调优

JAVA线程池的工作流程是怎么样的?

Java并发基础 - 线程池