java.util.concurrent
类 ArrayBlockingQueue<E>
java.lang.Object
java.util.AbstractCollection<E>
java.util.AbstractQueue<E>
java.util.concurrent.ArrayBlockingQueue<E>
一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。
这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。
底层是通过数组来实现的一个有界阻塞队列。
相当与一个有界缓存区,当向已满队列中存放元素会导致操作阻塞,直到队列非满
当从已空队列中提取元素也会阻塞,直到队列非空。
/** 存放元素的数组,final类型,表示数组不可变 不能扩容之类的 */ final Object[] items;
/** 下一个获取、删除元素的索引位 items index for next take, poll, peek or remove */ int takeIndex;
/** 下一个新增元素的索引位 items index for next put, offer, or add */ int putIndex;
/** 队列中元素个数 */ int count; |
/** 读写操作锁 */ final ReentrantLock lock; /** 获取元素操作的条件 */ private final Condition notEmpty; /** 插入元素操作的条件 */ private final Condition notFull; |
构造函数: public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0) throw new IllegalArgumentException(); this.items = new Object[capacity]; //初始化数组容量 lock = new ReentrantLock(fair); //公平锁 or 非公平锁 notEmpty = lock.newCondition(); notFull = lock.newCondition(); } |
新增元素: public boolean offer(E e) { checkNotNull(e); //非空检查 final ReentrantLock lock = this.lock; lock.lock(); //上锁 try { if (count == items.length) //判断是否队列已满 return false; else { //未满 insert(e); //插入 return true; } } finally { lock.unlock(); //释放锁 } } |
private void insert(E x) { items[putIndex] = x; putIndex = inc(putIndex); //判断putIndex是否已到队列尾 如果是则从0开始 ++count;//数量+1 notEmpty.signal();//唤醒非空条件下的线程 } |
final int inc(int i) { return (++i == items.length) ? 0 : i; //如果到队尾,则从0开始 } |
可阻塞新增元素: public void put(E e) throws InterruptedException { checkNotNull(e); final ReentrantLock lock = this.lock; lock.lockInterruptibly(); //可响应线程打断 try { while (count == items.length) //不断轮循判断 是否非满 如果满 则线程等待 notFull.await(); //await里面让线程进入当前条件的等待队列中 并释放锁 然后会自旋(while)挂起,直到被唤醒或者超时或者CACELLED,继而获取锁 insert(e); //条件满足后 插入 并唤醒 删除 操作线程 } finally { lock.unlock(); } } |
移除元素: public E poll() { final ReentrantLock lock = this.lock; lock.lock(); try { return (count == 0) ? null : extract(); //如果队列为空,则返回null } finally { lock.unlock(); } } |
private E extract() { final Object[] items = this.items; E x = this.<E>cast(items[takeIndex]); //获取takeIndex位置元素 items[takeIndex] = null; //赋值为null gc takeIndex = inc(takeIndex); //takeIndex自增 如果到队列尾,则从头开始 --count; //元素数量自减 notFull.signal(); //唤醒非满条件线程 表示可以做新增操作 return x; } |
可阻塞删除元素: public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); //响应线程打断 try { while (count == 0) notEmpty.await(); //阻塞 return extract(); //移除元素 并唤醒非满条件线程 } finally { lock.unlock(); } } |
参考:http://blog.csdn.net/longeremmy/article/details/8230264
http://www.blogjava.net/xylz/archive/2010/07/27/327265.html
相关推荐
`ArrayBlockingQueue` 是 Java 中实现并发编程时常用的一个线程安全的数据结构,它是一个有界的阻塞队列。在 `java.util.concurrent` 包下,`ArrayBlockingQueue` 继承自 `java.util.concurrent.BlockingQueue` 接口...
ArrayBlockingQueue是Java并发编程中一个重要的数据结构,它是Java并发包`java.util.concurrent`中的一个线程安全的阻塞队列。这个队列基于数组实现,提供了在生产者和消费者之间进行数据交换的能力,同时确保了线程...
"并发容器之ArrayBlockingQueue和LinkedBlockingQueue实现原理详解" ArrayBlockingQueue和LinkedBlockingQueue是Java并发容器中两个常用的阻塞队列实现,分别基于数组和链表存储元素。它们都继承自AbstractQueue类...
—BlockingQueue和ArrayBlockingQueue.pdf” 【描述】:此文档是关于Java并发编程的学习资料,以漫画形式讲解,聚焦于Java并发编程中的核心概念——BlockingQueue接口及其具体实现ArrayBlockingQueue。 【标签】:...
Java并发集合ArrayBlockingQueue的用法详解 Java并发集合ArrayBlockingQueue是Java并发集合框架下的一个重要组件,它提供了阻塞队列的实现,用于多线程环境下的并发操作。下面是对ArrayBlockingQueue的用法详解: ...
Java并发之ArrayBlockingQueue详细介绍 ArrayBlockingQueue是Java并发编程中常用的线程安全队列,经常被用作任务队列在线程池中。它是基于数组实现的循环队列,具有线程安全的实现。 ArrayBlockingQueue的实现 ...
Java中的ArrayBlockingQueue是一个高效的并发数据结构,它是Java并发包`java.util.concurrent`下的一个阻塞队列。本文将深入解析ArrayBlockingQueue的常用方法及其内部实现机制。 ArrayBlockingQueue的核心是一个...
ArrayBlockingQueue是Java并发编程中一个重要的集合类,它属于 BlockingQueue 接口的一个实现,主要特点是线程安全、有界以及基于数组的阻塞队列。线程安全得益于其内部使用了Java并发包中的ReentrantLock(可重入锁...
Java中的`LinkedBlockingQueue`和`ArrayBlockingQueue`都是`java.util.concurrent`包下的线程安全队列,它们都实现了`BlockingQueue`接口,提供了一种高效、线程安全的数据同步方式。这两种队列在很多方面都有相似之...
Java源码解析阻塞队列ArrayBlockingQueue介绍 Java源码解析阻塞队列ArrayBlockingQueue介绍是Java中的一种阻塞队列实现,使用ReentrantLock和Condition来实现同步和阻塞机制。本文将对ArrayBlockingQueue的源码进行...
Java源码解析阻塞队列ArrayBlockingQueue功能简介 ArrayBlockingQueue是Java中一个重要的阻塞队列实现,它基于数组实现了有界阻塞队列,提供FIFO(First-In-First-Out)功能。该队列的头元素是最长时间呆在队列中的...
在前面的的文章,写了一个带有缓冲区的队列,是用JAVA的Lock下的Condition实现的,但是JAVA类中提供了这项功能,是ArrayBlockingQueue, ArrayBlockingQueue是由数组支持的有界阻塞队列,次队列按照FIFO(先进先...
通常,我们会选择实现BlockingQueue的类,如ArrayBlockingQueue、LinkedBlockingQueue或PriorityBlockingQueue,根据实际需求选择合适的实现。 例如,我们可以创建一个配置类,如下所示: ```java @Configuration ...
ArrayBlockingQueue支持公平和非公平两种策略,公平策略意味着等待最久的线程优先获得资源,而非公平策略则不保证这一点。在高并发场景下,非公平策略通常能提供更好的性能。 2. LinkedBlockingQueue ...
ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue(10); Thread producer = new Thread(new Producer(queue)); Thread consumer = new Thread(new Consumer(queue)); producer.start(); consumer....
本节我们将深入探讨Disruptor框架以及与ArrayBlockingQueue的对比。 ArrayBlockingQueue是Java并发库中的一个阻塞队列实现,基于循环数组,提供了线程安全的入队和出队操作。在上述代码中,我们创建了一个固定大小...