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

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










