线程池中的阻塞队列有哪几种?

263次阅读  |  发布于3年以前

今天给大家带来的大厂面试题:

线程池中的阻塞队列有哪几种?

阻塞队列用于保存等待执行的任务。当任务的数量超过 corePoolSize 数量,后续的任务将会进入阻塞队列,阻塞排队。

线程池中用到了以下几种阻塞队列:

  1. ArrayBlockingQueue、
  2. LinkedBlockingQueue、
  3. SynchronousQueue、
  4. PriorityBlockQueue。

ArrayBlockingQueue

是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。

LinkedBlockingQueue

一个基于链表结构的阻塞队列,此队列按 FIFO 排序元素,吞吐量通常要高于 ArrayBlockingQueue。静态工厂方法 Executors.newFixedThreadPool() 使用了这个队列。(newFixedThreadPool 用于创建固定线程数)

LinkedBlockingQueue 原理

SynchronousQueue

一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于 LinkedBlockingQueue,静态工厂方法 Executors.newCachedThreadPool 使用这个队列。(newCachedThreadPool 用于根据需要创建新线程)

SynchronousQueue 原理

PriorityBlockingQueue

一个具有优先级的无限阻塞队列。

PriorityBlockQueue的原理图

参考:[干货 | 45张图庖丁解牛18种Queue,你知道几种?]

线程池问题汇总:

√ 线程池的原理?07-30

√ 阻塞队列有哪几种?08-01

[ ] 线程池如何使用?

[ ] 拒绝策略有哪几种?

[ ] 如何合理配置线程池参数?

[ ] 线程池如何监控?

[ ] Executor 框架?

[ ] Executor 有哪几种线程池?

嗯,

新的一天,赛亚人开始多倍重力历练了!

加油哇~

·······END·······

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8