J.U.C 阻塞队列(一) - BlockingQueue接口

1 阻塞队列

1.1 如何理解“队列”

队列这个概念非常好理解。你可以把它想象成排队买票,先来的先买,后来的人只能站末尾,不允许插队。先进者先出,这就是典型的“队列”。

相对于栈只支持两个基本操作:入栈 push()和出栈 pop(),对于也只支持两个操作入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素,因此队列跟栈一样,也是一种操作受限的线性表数据结构

image
1.2 阻塞队列

阻塞队列其实就是在队列基础上增加了阻塞操作。简单来说,就是在队列为空的时候,从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回。

2 BlockingQueue

BlockingQueue是在JDK1.5时,随着J.U.C引入的一个接口:用来描述阻塞队列。

3 BlockingQueue接口方法

public interface BlockingQueue extends Queue {
  
    //将元素插入队列尾部,方法在添加失败(比如队列已满)时,会报异常
    boolean add(E e);

    //将元素插入队列尾部,方法在添加失败(比如队列已满)时,不会抛出异常,值会返回false
    boolean offer(E e);

    //将元素插入队列尾部,方法在添加失败(比如队列已满)时, 会阻塞调用线程直到队列有空闲空间.
    void put(E e) throws InterruptedException;

    //将元素插入队列尾部,方法在添加失败(比如队列已满)时, 会限时阻塞调用线程,直到队列有空闲空间或超时.
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

    //将队首的元素删除,如果队列为空则抛出异常
    boolean remove(Object o);
    
    //将队首的元素删除,如果队列为空则返回null
    E poll();

    //将队首的元素删除,如果队列为空, 则阻塞调用线程直到队列中有元素.
    E take() throws InterruptedException;

    //将队首的元素删除,如果队列为空,, 则限时阻塞调用线程,直到队列中有元素或超时.
    E poll(long timeout, TimeUnit unit)
        throws InterruptedException;

    //返回剩余可用容量,没有容量限制返回Integer.MAX_VALUE
    int remainingCapacity();

    //是否包含指定元素
    public boolean contains(Object o);
    
    //将当前队列元素写入集合容器c
    int drainTo(Collection c);

    int drainTo(Collection c, int maxElements);
}

和Queue接口比较会发现BlockingQueue接口扩展了4个和阻塞相关的核心方法:put(e)、take();offer(e, time, unit)、poll(time, unit)。

接口方法分类

image
  • 抛出异常:满队列时,执行入队会抛出异常;空队列时执行出队会抛出异常 。

  • 返回特殊值:入队操作会返回布尔值;出队操作成功返回操作值,失败返回空值。

  • 一直阻塞:满队列时,执行入队线程会进入条件等待队列,并阻塞;空队列时,执行出队线程会进入条件等待队列,并阻塞 。

  • 超时退出:满队列时,执行入队线程会阻塞一段时间,如果超过一定的时间,执行入队线程就会退出。空队列时,执行出队线会阻塞一段时间,如果超过一定的时间,执行出队线程就会退出。

4 BlockingQueue特点

  • BlockingQueue队列中不能包含null元素;
  • BlockingQueue接口的实现类都必须是线程安全的,实现类一般通过“锁”保证线程安全;
  • BlockingQueue 可以是限定容量的。remainingCapacity()方法用于返回剩余可用容量,对于没有容量限制的BlockingQueue实现,该方法总是返回Integer.MAX_VALUE 。

5 BlockingQueue的实现类

类型
JDK7 提供了 7 个阻塞队列。分别是:

  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

你可能感兴趣的:(J.U.C 阻塞队列(一) - BlockingQueue接口)