线程池底层队列详解

2021-02-05 02:15

阅读:446

标签:cached   拒绝   执行   strong   任务   scheduled   一个   线程池   pool   

背景

  这篇博文是接着上一篇 线程池专题 的一个补充,是针对线程池底层队列的种类做一个进一步的深入详解,上一篇博文主要针对一线大厂针对线程池的灵魂 5 问展开的,而这一篇也是综合了另外面试经验,把底层的一些内容再深入剖析一下。

线程池任务处理

  如果运行的线程数 始终首选添加新的线程,而不进行排队。即任务根本不会存入queue中,而是直接运行

  如果运行的线程数 >= corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。 

  如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。

线程池队列详解

  针对 BlockingQueue workQueue 这个缓冲队列,在JDK中,其实已经说得很清楚了,一共有三种类型的queue,分别是:

  1. 直接提交 SynchronousQueue
  2. 无界队列 LinkedBlockingQueue
  3. 有界队列 ArrayBlockingQueue

  由上一篇 线程池专题 中源码部分分析可得知,其中

  FixedThreadPool 和 SingleThreadExecutor 是使用的无界队列 LinkedBlockingQueue

  CachedThreadPool 是使用的 直接提交队列 SynchronousQueue

  而 ScheduledThreadPool 使用的是 DelayedWorkQueue,这种队列的内部元素会按照延迟时间的长短对任务进行排序,延时时间越短地就排在队列的前面,越先被执行,他的内部采用的是“堆”的数据结构。

 

线程池底层队列详解

标签:cached   拒绝   执行   strong   任务   scheduled   一个   线程池   pool   

原文地址:https://www.cnblogs.com/liang1101/p/12791099.html


评论


亲,登录后才可以留言!