Java线程池队列ArrayBlockingQueue的使用及详细介绍-刘宇
作者:刘宇
CSDN博客地址:https://blog.csdn.net/liuyu973971883
有部分资料参考,如有侵权,请联系删除。如有不正确的地方,烦请指正,谢谢。
一、什么是ArrayBlockingQueue?
ArrayBlockingQueue是一个阻塞的队列,继承了AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以数组的形式保存数据,所以它是基于数组的阻塞队列。ArrayBlockingQueue是有边界值的,在创建ArrayBlockingQueue时就要确定好该队列的大小,一旦创建,该队列大小不可更改。内部的全局锁是使用的ReentrantLock。
二、使用场景
- 先进先出(队首是最旧的元素;队尾是新添加的元素)
- 有界队列(即初始化时指定的容量,就是队列最大的容量,不会出现扩容,容量满,则阻塞进队操作;容量空,则阻塞出队操作)
- 队列不支持空元素
三、常用的方法
1、构造方法
- capacity:队列初始化大小
- fair:表示该队列中的可重入锁是否公平,默认为false
- c:添加的集合
ArrayBlockingQueue(int capacity)
ArrayBlockingQueue(int capacity, boolean fair)
ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c)
2、add方法
在队列的尾部添加元素,返回true。当队列满的时候会抛出IllegalStateException异常。
boolean add(E e)
3、offer方法
在队列的尾部添加元素,如果添加成功返回true,否则返回false。
- e:添加的元素
- timeout:最多等待的时长
- unit:时间单位
boolean offer(E e)
boolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException
4、put方法
在队列的尾部添加元素,如果队列已满,则会阻塞住,等待队列有空闲位置,该方法可被打断。
void put(E e) throws InterruptedException
5、take方法
获取队列中的元素,如果没有则会被阻塞住。
E take() throws InterruptedException
6、poll方法
获取队列中队首的元素,获取后该元素就会移除该队列
- timeout:等待时长
- unit:时间单位
//立即返回
E poll()
//如果不能立即取出,则等待一定时间
E poll(long timeout, TimeUnit unit) throws InterruptedException
7、peek方法
读取队列中队首的元素,不会删除该元素。
E peek()
8、remove方法
删除队列中指定元素。
boolean remove(Object o)
9、contains方法
查询队列中是否存在某个元素
boolean contains(Object o)
10、remainingCapacity方法
返回队列中剩余空闲位置
int remainingCapacity()
11、drainTo方法
将队列中的元素排到指定集合中去
- c:目标集合
- maxElements:最多排几个元素
int drainTo(Collection<? super E> c)
int drainTo(Collection<? super E> c, int maxElements)