前言
-
{@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);
}