主题切换
常见阻塞队列
一、阻塞队列在线程池的作用
线程池workQueue:无空闲核心线程时,新任务进入队列排队;队列填满后,才会创建临时急救线程执行任务。
二、四种线程池常用阻塞队列
1. ArrayBlockingQueue
基于数组实现有界阻塞队列,先进先出FIFO,创建时必须指定容量上限。
2. LinkedBlockingQueue
基于单向链表实现,默认无界,也可手动指定容量变为有界队列,先进先出FIFO。
3. DelayedWorkQueue
延时优先级队列,每次出队取出队列中执行时间最早的任务,用于定时任务线程池ScheduledThreadPoolExecutor。
4. SynchronousQueue
不存储任何元素的阻塞队列,插入操作必须等待对应取出操作配对完成,相当于任务直接转交线程,不会排队。
三、ArrayBlockingQueue vs LinkedBlockingQueue 核心对比
| 对比维度 | LinkedBlockingQueue | ArrayBlockingQueue |
|---|---|---|
| 容量限制 | 默认无界,支持手动设置有界 | 强制有界,构造必须传容量 |
| 底层结构 | 链表节点Node | 固定长度数组 |
| 内存初始化 | 懒加载,入队时新建Node | 初始化一次性创建全部数组节点 |
| 内存开销 | 每次入队生成新Node,产生GC对象 | 数组提前初始化,无频繁对象创建 |
| 锁机制 | 头尾双锁,入队、出队可并发执行 | 单一把全局锁,入队出队互斥阻塞 |
四、面试简答
- 问:线程池有哪些阻塞队列?答: ArrayBlockingQueue、LinkedBlockingQueue、DelayedWorkQueue、SynchronousQueue。
- 问:Array和Linked阻塞队列锁区别?答: LinkedBlockingQueue使用头尾两把锁,入队出队互不阻塞,并发性能更好;ArrayBlockingQueue只有一把锁,读写互斥。
- 问:SynchronousQueue特点?答: 不缓存任务,插入必须等待消费线程,不会堆积任务,会直接创建临时线程。
- 问:DelayedWorkQueue用途?答: 延时优先级队列,定时任务线程池专用,按任务执行时间排序出队。