介绍
ArrayBlockingQueue是基于数组实现的共享通道,为什么说是共享通道,假说线程A希望给线程B发一个消息,用什么方式来告知线程B是比较合适的呢?可以使用BlockingQueue来实现。

通过上图中的继承关系我们可以清晰的发现ArrayBlockingQueue是BlockingQueue接口的实现,通过名称可以得出它是基于数组实现的,所以更适合做有界的队列。
刚才也提到过它是作为数据共享来进行的线程间数据的传递,那么问题来了,当队列中为空的时候消费队列的线程如何知道队列中有新的元素添加进去,队列满的时候又如何进行处理?我们带着上面的疑问来进行下面的分析。
主要的队列的入队、出队操作如下表所示:
插入队列方法
| 方法名称 | 参数描述 | 返回值 | 异常信息 |
|---|---|---|---|
| add | 插入对象 | ture代表插入成功,如果队列已满,抛出异常 | IllegalStateException(“Queue full”)异常——AbstractQueue |
| offer | 插入对象 | true代表插入成功,队列已满直接返回false | 无 |
| offer | 插入对象,等待时间 | true代表插入成功,队列已满等待一段时间后仍没有空间则返回false | 无 |
| put | 插入对象 | true代表插入成功,如果队列已满则阻塞线程等待队列为空的时候插入 |
获取队列内容
| 方法名称 | 参数描述 | 返回值 | 异常信息 |
|---|---|---|---|
| remove | 无 | 返回队首数据并移除,队列已空则抛出异常信息 | NoSuchElementException()异常——AbstractQueue |
| poll | 无 | 列不为空时返回队首值并移除;队列为空时返回null。非阻塞立即返回。 | |
| poll | 等待时间 | 设定等待的时间,如果在指定时间内队列还未获取到则返回null,不为空则返回队首值 | |
| take | 无 | 队列不为空返回队首值并移除;当队列为空时会阻塞等待,一直等到队列不为空时再返回队首值。 |
简单实例
上面的方法中重点的内容在于put和take方法,我们以一个实例来看一下这个队列的作用。
/**
* ArrayBlockingQueue内容测试demo
*
* @author <a href="mailto:dwlsxj@126.com">battleheart</a>
*/
public class BlockQueueDemo {
public static final ArrayBlockingQueue<Integer> arr = new ArrayBlockingQueue<>(10);
private static int sum = 0;
public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 20; i++) {
try {
System.out.println(i + "预备入队");
Thread.sleep(100);
arr.put(i)

ArrayBlockingQueue是一个基于数组的有界阻塞队列,用于线程间的数据共享和传递。它通过ReentrantLock和Condition实现同步及等待通知机制。当队列满时,put操作会阻塞,直到队列有空位;当队列空时,take操作会阻塞,直到有元素可用。内部的enqueue和deque方法协调入队和出队操作,确保线程安全。此队列适用于生产者-消费者模型,有效地实现了数据的同步交换。
最低0.47元/天 解锁文章
6594





