标签:cached 拒绝 执行 strong 任务 scheduled 一个 线程池 pool
这篇博文是接着上一篇 线程池专题 的一个补充,是针对线程池底层队列的种类做一个进一步的深入详解,上一篇博文主要针对一线大厂针对线程池的灵魂 5 问展开的,而这一篇也是综合了另外面试经验,把底层的一些内容再深入剖析一下。
如果运行的线程数 < corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。即任务根本不会存入queue中,而是直接运行
如果运行的线程数 >= corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。
如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。
针对 BlockingQueue <Runnable> workQueue 这个缓冲队列,在JDK中,其实已经说得很清楚了,一共有三种类型的queue,分别是:
由上一篇 线程池专题 中源码部分分析可得知,其中
FixedThreadPool 和 SingleThreadExecutor 是使用的无界队列 LinkedBlockingQueue
CachedThreadPool 是使用的 直接提交队列 SynchronousQueue
而 ScheduledThreadPool 使用的是 DelayedWorkQueue,这种队列的内部元素会按照延迟时间的长短对任务进行排序,延时时间越短地就排在队列的前面,越先被执行,他的内部采用的是“堆”的数据结构。
标签:cached 拒绝 执行 strong 任务 scheduled 一个 线程池 pool
原文地址:https://www.cnblogs.com/liang1101/p/12791099.html