一、BlockingQueue 接口概览
✅ 定义位置:
public interface BlockingQueue<E> extends Queue<E>
继承自 Queue
,增加了阻塞操作的能力。
✅ 核心方法分类(按行为)
方法 | 行为 |
---|---|
add(E e) |
添加元素,失败抛异常 |
offer(E e) |
添加元素,失败返回 false |
put(E e) |
添加元素,队列满则阻塞 |
remove() | 移除元素,失败抛异常 |
poll() |
秩序移除,失败返回 null |
take() |
移除元素,队列空则阻塞 |
peek() |
查看队首元素,不移除 |
二、常用实现类对比
实现类 | 是否有界 | 线程安全 | 数据结构 | 特点 |
---|---|---|---|---|
ArrayBlockingQueue |
✅ 是 | ✅ ReentrantLock | 数组 | 固定大小、性能高 |
LinkedBlockingQueue |
❌ 否(可配置) | ✅ ReentrantLock + Condition | 链表 | 支持无界,适合生产-消费模型 |
PriorityBlockingQueue |
❌ 否 | ✅ ReentrantLock | 堆 | 支持优先级排序 |
SynchronousQueue |
✅ 是(容量为 0) | ✅ CAS + LockSupport | 无缓冲区 | 直接传递任务 |
DelayQueue |
❌ 否 | ✅ ReentrantLock | 延迟堆 | 按时间排序,延迟取出 |
三、ArrayBlockingQueue 原理详解
✅ 构造函数
ArrayBlockingQueue(int capacity, boolean fair)
-
capacity
:队列最大容量; -
fair
:是否公平锁(默认非公平);
🖼️ 底层结构图(Markdown 图形化)
[items] = [null][task1][task2][task3][null][null] ↑ ↑ ↑ takeIndex putIndex
-
使用一个
Object[] items
存储数据; -
int takeIndex
:下一个出队的位置; -
int putIndex