ArrayBlockingQueue原理详解

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

介绍

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

1554447867621.jpg

通过上图中的继承关系我们可以清晰的发现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)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值