ArrayBlockingQueue是Java中基于数组、线程安全、有界且FIFO的阻塞队列;构造时需指定固定容量,支持公平/非公平锁,通过ReentrantLock+Condition实现线程协作,put()方法在队列满时阻塞插入。

ArrayBlockingQueue 是 Java 并发包(java.util.concurrent)中一个线程安全、基于数组实现的有界阻塞队列。它适合在生产者-消费者模型中控制缓冲区大小,防止内存无限增长,同时天然支持线程间协作。
创建与基本特性
必须指定容量(构造时传入 int capacity),一旦初始化,容量不可变;内部使用 ReentrantLock + Condition 实现线程安全和阻塞等待;队列遵循 FIFO 原则;支持公平/非公平锁策略(可选参数)。
常用构造方式:
- ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<>(10); —— 默认非公平,容量为 10
- ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(5, true); —— 公平模式,容量为 5
生产者:put() 阻塞插入
当队列满时,put(E e) 会阻塞当前线程,直到有空间可用。适合“必须存入”的场景,不希望丢数据。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
示例片段:
new Thread(() -> {
for (int i = 0; i < 20; i++) {
try {
queue.put("item-" + i); // 若满,线程挂起等待
System.out.println("Produced: item-" + i);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}).start();
消费者:take() 阻塞获取
当队列为空时,take() 同样会阻塞,直到有元素可取。与 put 配合,构成典型的等待-唤醒协作机制。
示例片段:
new Thread(() -> {
for (int i = 0; i < 20; i++) {
try {
String item = queue.take(); // 若空,线程挂起等待
System.out.println("Consumed: " + item);
Thread.sleep(100); // 模拟处理耗时
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
}).start();
其他常用操作与注意事项
除了核心的 put/take,还可根据需求选择非阻塞或限时操作:
- offer(E e):成功返回 true,队列满则立即返回 false(不阻塞)
- poll():有元素则取出并返回,否则立即返回 null
- offer(E e, long timeout, TimeUnit unit):最多等待指定时间,超时前仍无空间则返回 false
- poll(long timeout, TimeUnit unit):最多等待指定时间,超时前仍无元素则返回 null
- 注意:所有操作都线程安全,但 size() 返回的是近似值(因并发修改,可能滞后);若需精确判断,建议用 isEmpty() / isFull() 辅助


















