线程池底层队列详解
Posted liang1101
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池底层队列详解相关的知识,希望对你有一定的参考价值。
背景
这篇博文是接着上一篇 线程池专题 的一个补充,是针对线程池底层队列的种类做一个进一步的深入详解,上一篇博文主要针对一线大厂针对线程池的灵魂 5 问展开的,而这一篇也是综合了另外面试经验,把底层的一些内容再深入剖析一下。
线程池任务处理
如果运行的线程数 < corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。即任务根本不会存入queue中,而是直接运行
如果运行的线程数 >= corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。
如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。
线程池队列详解
针对 BlockingQueue <Runnable> workQueue 这个缓冲队列,在JDK中,其实已经说得很清楚了,一共有三种类型的queue,分别是:
- 直接提交 SynchronousQueue
- 无界队列 LinkedBlockingQueue
- 有界队列 ArrayBlockingQueue
由上一篇 线程池专题 中源码部分分析可得知,其中
FixedThreadPool 和 SingleThreadExecutor 是使用的无界队列 LinkedBlockingQueue
CachedThreadPool 是使用的 直接提交队列 SynchronousQueue
而 ScheduledThreadPool 使用的是 DelayedWorkQueue,这种队列的内部元素会按照延迟时间的长短对任务进行排序,延时时间越短地就排在队列的前面,越先被执行,他的内部采用的是“堆”的数据结构。
以上是关于线程池底层队列详解的主要内容,如果未能解决你的问题,请参考以下文章