Java 源码 - java.util.concurrent.BlockingQueue

162 阅读2分钟

介绍

BlockingQueue 继承自 Queue 接口,下面看看阻塞队列提供的接口;

public interface BlockingQueue<E> extends Queue<E> {
    /**
     * 插入数据到队列尾部(如果立即可行且不会超过该队列的容量)
     * 在成功时返回 true,如果此队列已满,则抛IllegalStateException。(与offer方法的区别)
     */
    boolean add(E e);

    /**
     * 插入数据到队列尾部,如果没有空间,直接返回false;
     * 有空间直接插入,返回true。
     */
    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;

    //除了上述方法还有继承自Queue接口的方法 
    /**
     * 取出和删除队列头元素,如果是空队列直接返回null。
     */
    E poll();

    /**
     * 取出但不删除头元素,该方法与peek方法的区别是当队列为空时会抛出NoSuchElementException异常
     */
    E element();

    /**
     * 取出但不删除头元素,空队列直接返回null
     */
    E peek();

    /**
     * 返回队列总额外的空间
     */
    int remainingCapacity();

    /**
     * 删除队列中存在的元素
     */
    boolean remove(Object o);

   /**
    * 判断队列中是否存在当前元素
    */
    boolean contains(Object o);

}
  • 插入方法

add(E e): 添加成功返回true,失败抛IllegalStateException异常

offer(E e): 成功返回 true,如果此队列已满,则返回 false。

put(E e): 将元素插入此队列的尾部,如果该队列已满,则一直阻塞

  • 删除方法

remove(Object o): 移除指定元素,成功返回true,失败返回false

poll(): 获取并移除此队列的头元素,若队列为空,则返回 null

take(): 获取并移除此队列的头元素,若队列为空,则一直阻塞

  • 检查方法

peek(): 获取但不移除此队列的头元素,没有元素则抛NoSuchElementException异常

element(): 获取但不移除此队列的头;若队列为空,则返回 null。