JDK1.8源码解读之BlockingQueue

305 阅读7分钟

前言

  • {@link Deque}额外支持阻止操作,这些操作将在检索元素时等待双端队列变为非空,并在存储元素时等待双端队列中的空间变为可用。

  • {@code BlockingDeque}方法有四种形式,它们以不同的方式处理操作,这些方法无法立即满足,但将来可能会满足:

  • 第一种抛出异常,

  • 第二种返回特殊值(两种方法之一null}或{@code false},具体取决于操作),

  • 第三个无限期阻塞当前线程,直到操作成功为止;

  • 第四个阻塞仅一个给定的最大时间限制,然后再放弃。

  • 与任何{@link BlockingQueue}一样,{@code BlockingDeque}是线程安全的,不允许使用null元素,并且可能(或可能不)受容量限制。

源码


package java.util.concurrent;
 
public interface BlockingDeque<E> extends BlockingQueue<E>, Deque<E> {
   
    /**
     * 如果可以在不违反容量限制的情况下立即执行此操作,则将指定的元素插入此双端队列的前面,
     * 如果当前没有可用空间,则抛出{@code IllegalStateException}。
     * 使用容量受限的双端队列时,通常最好使用{@link #offerFirst(Object)offerFirst}。
     *
     */
    void addFirst(E e);

    /**
     * 如果可以立即执行此操作,而不会违反容量限制,则在此双端队列的末尾插入指定的元素;
     * 如果当前没有可用空间,则抛出{@code IllegalStateException}。
     * 使用容量受限的双端队列时,通常最好使用{@link #offerLast(Object)offerLast}。
     *
     */
    void addLast(E e);

    /**
     *
     * 如果可以立即执行此操作,而不会违反容量限制,则在此双端队列的前面插入指定的元素;
     * 如果成功,则返回{@code true},如果当前没有可用空间,则返回{@code false}。
     * 使用容量受限的双端队列时,此方法通常比{@link #addFirst(Object)addFirst}方法更可取,该方法只能通过引发异常来插入元素。
     *
     */
    boolean offerFirst(E e);

    /**
     * 如果可以立即执行此操作,而不会违反容量限制,则在此双端队列的末尾插入指定的元素;
     * 如果成功,则返回{@code true},如果当前没有可用空间,则返回{@code false}。
     * 当使用容量受限的双端队列时,此方法通常比{@link #addLast(Object)addLast}方法更可取,该方法只能通过引发异常来插入元素。
     *
     */
    boolean offerLast(E e);

    /**
     * 将指定的元素插入此双端队列的前面,如有必要,请等待空间变大。
     */
    void putFirst(E e) throws InterruptedException;

    /**
     * 将指定的元素插入此双端队列的末尾,如有必要,请等待空间变大。
     * Inserts the specified element at the end of this deque,
     * waiting if necessary for space to become available.
     *
     */
    void putLast(E e) throws InterruptedException;

    /**
     * 将指定的元素插入此双端队列的前面,并在必要时等待指定的等待时间以腾出空间。
     */
    boolean offerFirst(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 在此双端队列的末尾插入指定的元素,并在必要时等待指定的等待时间以腾出空间。
     *
     */
    boolean offerLast(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 检索并删除此双端队列的第一个元素,如有必要,请等待直到元素可用。
     *
     */
    E takeFirst() throws InterruptedException;

    /**
     * 检索并删除此双端队列的最后一个元素,如有必要,请等待直到元素可用。
     */
    E takeLast() throws InterruptedException;

    /**
     * 检索并删除此双端队列的第一个元素,并在必要时等待指定的等待时间,以使元素变为可用。
     */
    E pollFirst(long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 检索并删除此双端队列的最后一个元素,并在必要时等待指定的等待时间,以使元素变为可用。
     *
     */
    E pollLast(long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 从此双端队列删除指定元素的第一次出现。
     * 如果双端队列不包含元素,则它保持不变。
     * 更正式地说,删除第一个元素{@code e},以使{@code o.equals(e)}(如果存在这样的元素)。
     * 如果此双端队列包含指定的元素(或者等效地,如果此双端队列由于调用而更改),则返回{@code true}。
     */
    boolean removeFirstOccurrence(Object o);

    /**
     * 从此双端队列移除最后一次出现的指定元素。
     * 如果双端队列不包含元素,则它保持不变。
     * 更正式地,删除最后一个元素{@code e},以使{@code o.equals(e)}(如果存在这样的元素)。
     * 如果此双端队列包含指定的元素(或者等效地,如果此双端队列由于调用而更改),则返回{@code true}。
     *
     */
    boolean removeLastOccurrence(Object o);

    // *** BlockingQueue methods ***

    /**
     * 如果可以在不违反容量限制的情况下立即执行操作,则将指定的元素插入此双端队列表示的队列中(换句话说,在此双端队列的末尾),成功后返回{@code true}并抛出一个{@code IllegalStateException},如果当前没有可用空间。
     * 使用容量受限的双端队列时,通常最好使用{@link #offer(Object)offer}。
     * 此方法等效于{@link #addLast(Object)addLast}。
     *
     */
    boolean add(E e);

    /**
     * 如果可以在不违反容量限制的情况下立即执行操作,则将指定的元素插入此双端队列表示的队列中(换句话说,在此双端队列的末尾),并在成功后返回{@code true}和{@code false}如果当前没有可用空间。
     * 当使用容量受限的双端队列时,此方法通常比{@link #add}方法更可取,后者只能通过引发异常才能插入元素。
     * 此方法等效于{@link #offerLast(Object)offerLast}。
     *
     */
    boolean offer(E e);

    /**
     *
     * 将指定的元素插入到此双端队列表示的队列中(换句话说,在此双端队列的末尾),如有必要,请等待空间变为可用。
     * 此方法等效于{@link #putLast(Object)putLast}。
     *
     */
    void put(E e) throws InterruptedException;

    /**
     * 将指定的元素插入到此双端队列表示的队列中(换句话说,在此双端队列的末尾),并在必要时等待指定的等待时间以使空间可用。
     * 此方法等效于{@link #offerLast(Object,long,TimeUnit)offerLast}。
     *
     */
    boolean offer(E e, long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 缓存并删除此双端队列代表的队列的头部(换句话说,此双端队列的第一个元素)。
     * 此方法与{@link #poll poll}的不同之处仅在于,如果此双端队列为空,则它将引发异常。
     * 此方法等效于{@link #removeFirst()removeFirst}。
     */
    E remove();

    /**
     * 检索并删除此双端队列表示的队列的头部(换句话说,此双端队列的第一个元素),如果此双端队列为空,则返回{@code null}。
     * 此方法等效于{@link #pollFirst()}。
     *
     */
    E poll();

    /**
     * 检索并删除此双端队列代表的队列的头部(换句话说,此双端队列的第一个元素),如有必要,请等待直到元素可用。
     */
    E take() throws InterruptedException;

    /**
     * 检索并删除此双端队列代表的队列的头部(换句话说,此双端队列的第一个元素),并在必要时等待指定的等待时间,以使元素变为可用。
     * 此方法等效于{@link #pollFirst(long,TimeUnit)pollFirst}。
     *
     */
    E poll(long timeout, TimeUnit unit)
        throws InterruptedException;

    /**
     * 检索但不删除此双端队列代表的队列的头(换句话说,此双端队列的第一个元素)。
     * 此方法与{@link #peek peek}的不同之处仅在于,如果此双端队列为空,则它将引发异常。
     * 此方法等效于{@link #getFirst()getFirst}。
     */
    E element();

    /**
     * 检索但不删除此双端队列表示的队列的头部(换句话说,此双端队列的第一个元素),如果此双端队列为空,则返回{@code null}。
     * 此方法等效于{@link #peekFirst()peekFirst}。
     */
    E peek();

    /**
     * 从此双端队列删除指定元素的第一次出现。
     * 如果双端队列不包含元素,则它保持不变。
     * 更正式地说,删除第一个元素{@code e},以使{@code o.equals(e)}(如果存在这样的元素)。
     * 如果此双端队列包含指定的元素(或者等效地,如果此双端队列由于调用而更改),则返回{@code true}。
     * 此方法等效于{@link #removeFirstOccurrence(Object)removeFirstOccurrence}。
     *
     */
    boolean remove(Object o);

    public boolean contains(Object o);

    public int size();

    Iterator<E> iterator();

    // *** Stack methods ***

    void push(E e);
}