阻塞队列(一)(BlockingQueue)

阻塞队列概要

阻塞队列与我们平常接触的普通队列(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。

阻塞队列对元素的增删改查主要就是上述三类方法,通常情况下我们都是通过上述三类方法操作阻塞队列。

后面具体分析具体的实现队列

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容