Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?
Posted 砖业洋__
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?相关的知识,希望对你有一定的参考价值。
欢迎关注
Java
面试系列,不定期更新面试小短文。欢迎一键三连!
当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?
当我们提交一个任务到线程池,它的工作原理如下:
- 预热核心线程
如果线程池的线程数小于corePoolSize
(核心线程阈值),即使其他核心线程处于空闲状态,也会创建一个新核心线程来运行新任务。
- 把任务添加到阻塞队列
如果线程池的线程数大于等于corePoolSize
但少于maxPoolSize
(最大线程数阈值),则将任务放入阻塞队列。
- 如果添加阻塞队列失败,这时会创建一个非核心线程来增加处理效率
如果阻塞队列已满,并且线程池的线程数小于maxPoolSize
,则创建一个新非核心线程来运行任务。
- 如果非核心线程数量达到阈值,就会触发一个拒绝策略
如果阻塞队列已满,并且线程数大于或等于maxPoolSize
,则拒绝该任务。
所以如果我们希望这个任务不进入到阻塞队列,那么只需要处理第二步就好。
在Java
线程池里,它的构造方法里有一个参数可以去修改阻塞队列的类型
其中有一个阻塞队列叫SynchronousQueue
,这个队列是不能存储任何元素的阻塞队列,它的特性是每生产一个任务就必须指派一个消费者来处理这个任务,否则就会阻塞生产者。
基于这个特性,我们只需要把线程池的阻塞队列替换成SynchronousQueue
就好了,它就能够直接去避免任务进入到阻塞队列,而是直接去启动最大线程数量去处理任务。
欢迎一键三连~
有问题请留言,大家一起探讨学习
----------------------Talk is cheap, show me the code-----------------------
以上是关于Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?的主要内容,如果未能解决你的问题,请参考以下文章
Java面试小短文当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?