阻塞queue系列之ArrayBlockingQueue
程序员文章站
2022-06-08 08:10:18
...
extends AbstractQueueimplements BlockingQueue, java.io.Serializable一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。添加和删除使用的是同一把锁ReentrantLock。造成在存取两种操作时会竞争同一把锁,而使得性能相对低下。
特点
- 有界
- FIFO(先进先出)
- Once created, the capacity cannot be changed.
构造方法
public ArrayBlockingQueue(int capacity) {
this(capacity, false);
}
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
从源码可以看出ArrayBlockingQueue的是否公平,实际是ReentrantLock的公平。
常用方法
- offer 添加元素
从源码可以看出,返回类型boolean,如果容量达到满值,则无法插入,返回false.
- add 添加元素
add方法其实调用就是offer方法,只是当offer方法返回false后,会抛出IllegalStateException(“Queue full”)异常。
- put 添加元素
与上述方法不同的是,该方法会阻塞,直到有空间可以插入元素。
- poll 取元素
取第一个元素,并且删除。
- peek 取元素
取第一个元素,不会删除
- take 取元素
若没有元素会一直阻塞,再到有元素存入。
-
drainTo(Collection<? super E> c)
排干
把queue的元素全部移到了list集合中。
上一篇: L2-028. 秀恩爱分得快
下一篇: SqlServer基础:游标
推荐阅读
-
Java并发 之 阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
-
阻塞queue系列之DelayQueue
-
阻塞queue系列之ArrayBlockingQueue
-
阻塞queue系列之PriorityBlockingQueue
-
Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程...
-
python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)
-
Java并发 之 阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
-
并发包阻塞队列之ArrayBlockingQueue
-
并发包阻塞队列之ArrayBlockingQueue