阻塞队列概要
阻塞队列与我们平常接触的普通队列(list)最大的不同点,在于阻塞队列支持阻塞添加和阻塞删除方法。
- 阻塞添加
所谓的阻塞添加是指当阻塞队列元素满时,队列会阻塞加入元素的线程,知道队列不满时才唤醒阻塞线程执行写入操作
- 阻塞删除
阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再唤醒删除操作(一般都会返回被删除元素)
Java中阻塞队列接口BlockingQueue 继承自Queue 接口,先来看下接口为我们提供的方法:
public interface BlockingQueue<E> extends Queue<E> {
//将指定元素插入队列
//成功返回success,如果空间不可用抛出IllegalStateException
boolean add(E e);
//成功返回true,失败返回false
boolean offer(E e);
//将指定元素放入队列
//如果队列已满,则阻塞等待知道有空间,如果等待中被打断抛出异常
void put(E e) throws InterruptedException;
//成功返回true,等待超时返回false
boolean offer(E e, long timeout, TimeUnit unit)
throws InterruptedException;
//获取并移除次队列头部,如果没有元素则等待
//直到有元素则唤醒等待线程
E take() throws InterruptedException;
//获取并移除队列头部元素
//超过指定等待时间则返回null
E poll(long timeout, TimeUnit unit)
throws InterruptedException;
//返回剩余容量,该值只是近似值,你不能保证其他线程正在操作该队列
int remainingCapacity();
//移除指定元素
boolean remove(Object o);
//是否包含指定元素
public boolean contains(Object o);
//所有元素转移至传入的集合
int drainTo(Collection<? super E> c);
//最多转入元素
int drainTo(Collection<? super E> c, int maxElements);
}
在此基础上,我们将上述操作api进行分类:
插入方法:
- add(E e) : 添加成功返回true,失败抛IllegalStateException异常
- offer(E e) : 成功返回 true,如果此队列已满,则返回 false
- put(E e) :将元素插入此队列的尾部,如果该队列已满,则一直阻塞
删除方法:
- remove(Object o) :移除指定元素,成功返回true,失败返回false
- poll() : 获取并移除此队列的头元素,若队列为空,则返回 null
- take():获取并移除此队列头元素,若没有元素则一直阻塞
检查方法:
- element() :获取但不移除此队列的头元素,没有元素则抛异常
- peek() :获取但不移除此队列的头;若队列为空,则返回 null。
阻塞队列对元素的增删改查主要就是上述三类方法,通常情况下我们都是通过上述三类方法操作阻塞队列。
网友评论