美文网首页JAVA
阻塞队列(一)(BlockingQueue)

阻塞队列(一)(BlockingQueue)

作者: 逗逼程序员 | 来源:发表于2019-11-14 10:07 被阅读0次

阻塞队列概要

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

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

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

相关文章

  • 阻塞队列 BlockingQueue

    阻塞队列 BlockingQueue BlockingQueue用法 BlockingQueue 通常用于一个线...

  • 26. 并发终结之BlockingQueue

    线程池里面最重要的还有个并发容器,即阻塞队列BlockingQueue。BlockingQueue是阻塞队列的接口...

  • 探讨阻塞队列和线程池源码

    阻塞队列 非阻塞队列是一个先进先出的单向队列(Queue),而BlockingQueue阻塞队列实际是非阻塞队列的...

  • Java并发编程:阻塞队列

    Java并发编程:阻塞队列BlockingQueue 以上7类阻塞队列中有LinkedBlockingQueue,...

  • Android中的线程与线程池

    阻塞队列BlockingQueue 阻塞队列常用于生产者——消费者模型,生产者往阻塞队列插入数据,消费者往阻塞队列...

  • Java并发-22.阻塞队列

    阻塞队列(BlockingQueue)是一种支持两个附加操作的队列: 支持阻塞的插入:队列满时,队列阻塞插入元素的...

  • 阻塞队列

    BlockingQueue线程池的数据结构是阻塞队列BlockingQueue。(在多线程领域:所谓阻塞,在某些情...

  • Java并发包之BlockingQueue

    一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻...

  • 阻塞队列

    阻塞队列BlockingQueue不支持插入null元素,好好了解一下阻塞队列接口设计。 了解阻塞队列的接口方法后...

  • 19-阻塞队列之ArrayBlockingQueue

    Java中的阻塞队列 什么是阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附...

网友评论

    本文标题:阻塞队列(一)(BlockingQueue)

    本文链接:https://www.haomeiwen.com/subject/omwlictx.html