E
- 保存在此 collection 中的元素类型
public interface BlockingDeque<E>
支持两个附加操作的 Queue
,这两个操作是:获取元素时等待双端队列变为非空;存储元素时等待双端队列中的空间变得可用。
BlockingDeque 方法有四种形式,使用不同的方式处理无法立即满足但在将来某一时刻可能满足的操作:第一种方式抛出异常;第二种返回一个特殊值(null 或 false,具体取决于操作);第三种无限期阻塞当前线程,直至操作成功;第四种只阻塞给定的最大时间,然后放弃。下表中总结了这些方法:
第一个元素(头部) | ||||
抛出异常 | 特殊值 | 阻塞 | 超时期 | |
插入 | addFirst(e) |
offerFirst(e) |
putFirst(e) |
offerFirst(e, time, unit) |
移除 | removeFirst() |
pollFirst() |
takeFirst() |
pollFirst(time, unit) |
检查 | getFirst() |
peekFirst() |
不适用 | 不适用 |
最后一个元素(尾部) | ||||
抛出异常 | 特殊值 | 阻塞 | 超时期 | |
插入 | addLast(e) |
offerLast(e) |
putLast(e) |
offerLast(e, time, unit) |
移除 | removeLast() |
pollLast() |
takeLast() |
pollLast(time, unit) |
检查 | getLast() |
peekLast() |
不适用 | 不适用 |
像所有 BlockingQueue
一样,BlockingDeque 是线程安全的,但不允许 null 元素,并且可能有(也可能没有)容量限制。
BlockingDeque 实现可以直接用作 FIFO BlockingQueue。继承自 BlockingQueue 接口的方法精确地等效于下表中描述的 BlockingDeque 方法:
BlockingQueue 方法 | 等效的 BlockingDeque 方法 |
插入 | |
add(e) |
addLast(e) |
offer(e) |
offerLast(e) |
put(e) |
putLast(e) |
offer(e, time, unit) |
offerLast(e, time, unit) |
移除 | |
remove() |
removeFirst() |
poll() |
pollFirst() |
take() |
takeFirst() |
poll(time, unit) |
pollFirst(time, unit) |
检查 | |
element() |
getFirst() |
peek() |
peekFirst() |
内存一致性效果:当存在其他并发 collection 时,将对象放入 BlockingDeque
之前的线程中的操作 happen-before 随后通过另一线程从 BlockingDeque
中访问或移除该元素的操作。
此接口是 Java Collections Framework 的成员。
方法摘要 | |
---|---|
boolean |
add(E e) Inserts the 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列表示的队列中(即此双端队列的尾部),并在成功时返回 true;如果当前没有空间可用,则抛出 IllegalStateException。 |
void |
addFirst(E e) 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的开头;如果当前没有空间可用,则抛出 IllegalStateException。 |
void |
addLast(E e) 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的末尾;如果当前没有空间可用,则抛出 IllegalStateException。 |
boolean |
contains(Object o) 如果此双端队列包含指定的元素,则返回 true。 |
E |
element() 获取但不移除此双端队列表示的队列的头部(即此双端队列的第一个元素)。 |
Iterator<E> |
iterator() 返回在此双端队列中的元素上以恰当顺序进行迭代的迭代器。 |
boolean |
offer(E e) 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列表示的队列中(即此双端队列的尾部),并在成功时返回 true;如果当前没有空间可用,则返回 false。 |
boolean |
offer(E e, long timeout, TimeUnit unit) 将指定的元素插入此双端队列表示的队列中(即此双端队列的尾部),必要时将在指定的等待时间内一直等待可用空间。 |
boolean |
offerFirst(E e) 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的开头,并在成功时返回 true;如果当前没有空间可用,则返回 false。 |
boolean |
offerFirst(E e, long timeout, TimeUnit unit) 将指定的元素插入此双端队列的开头,必要时将在指定的等待时间内等待可用空间。 |
boolean |
offerLast(E e) 如果立即可行且不违反容量限制,则将指定的元素插入此双端队列的末尾,并在成功时返回 true;如果当前没有空间可用,则返回 false。 |
boolean |
offerLast(E e, long timeout, TimeUnit unit) 将指定的元素插入此双端队列的末尾,必要时将在指定的等待时间内等待可用空间。 |
E |
peek() 获取但不移除此双端队列表示的队列的头部(即此双端队列的第一个元素);如果此双端队列为空,则返回 null。 |
E |
poll() 获取并移除此双端队列表示的队列的头部(即此双端队列的第一个元素);如果此双端队列为空,则返回 null。 |
E |
poll(long timeout, TimeUnit unit) 获取并移除此双端队列表示的队列的头部(即此双端队列的第一个元素),如有必要将在指定的等待时间内等待可用元素。 |
E |
pollFirst(long timeout, TimeUnit unit) 获取并移除此双端队列的第一个元素,必要时将在指定的等待时间等待可用元素。 |
E |
pollLast(long timeout, TimeUnit unit) 获取并移除此双端队列的最后一个元素,必要时将在指定的等待时间内等待可用元素。 |
void |
push(E e) 将元素推入此双端队列表示的栈。 |
void |
put(E e) 将指定的元素插入此双端队列表示的队列中(即此双端队列的尾部),必要时将一直等待可用空间。 |
void |
putFirst(E e) 将指定的元素插入此双端队列的开头,必要时将一直等待可用空间。 |
void |
putLast(E e) 将指定的元素插入此双端队列的末尾,必要时将一直等待可用空间。 |
E |
remove() 获取并移除此双端队列表示的队列的头部(即此双端队列的第一个元素)。 |
boolean |
remove(Object o) 从此双端队列移除第一次出现的指定元素。 |
boolean |
removeFirstOccurrence(Object o) 从此双端队列移除第一次出现的指定元素。 |
boolean |
removeLastOccurrence(Object o) 从此双端队列移除最后一次出现的指定元素。 |
int |
size() 返回此双端队列中的元素数。 |
E |
take() 获取并移除此双端队列表示的队列的头部(即此双端队列的第一个元素),必要时将一直等待可用元素。 |
E |
takeFirst() 获取并移除此双端队列的第一个元素,必要时将一直等待可用元素。 |
E |
takeLast() 获取并移除此双端队列的最后一个元素,必要时将一直等待可用元素。 |
从接口 java.util.concurrent.BlockingQueue 继承的方法 |
---|
drainTo, drainTo, remainingCapacity |
从接口 java.util.Deque 继承的方法 |
---|
descendingIterator, getFirst, getLast, peekFirst, peekLast, pollFirst, pollLast, pop, removeFirst, removeLast |
从接口 java.util.Collection 继承的方法 |
---|
addAll, clear, containsAll, equals, hashCode, isEmpty, removeAll, retainAll, toArray, toArray |
方法详细信息 |
---|
void addFirst(E e)
offerFirst
。
e
- 要添加的元素
IllegalStateException
- 如果此时由于容量限制而无法添加元素
ClassCastException
- 如果指定元素的类不允许将它添加此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某些属性不允许将它添加到此双端队列
void addLast(E e)
offerLast
。
e
- 要添加的元素
IllegalStateException
- 如果此时由于容量限制而无法添加元素
ClassCastException
- 如果指定元素的类不允许将它添加此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某些属性不允许将它添加到此双端队列
boolean offerFirst(E e)
addFirst
方法,后者可能无法插入元素,而只是抛出一个异常。
Deque<E>
中的
offerFirst
e
- 要添加的元素
ClassCastException
- 如果指定元素的类不允许将它添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某些属性不允许将它添加到此双端队列
boolean offerLast(E e)
addLast
方法,后者可能无法插入元素,而只是抛出一个异常。
e
- 要添加的元素
ClassCastException
- 如果指定元素的类不允许将它添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某些属性不允许将它添加到此双端队列
void putFirst(E e) throws InterruptedException
e
- 要添加的元素
InterruptedException
- 如果在等待时被中断
ClassCastException
- 如果指定元素的类不允许它被添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某个属性不允许它被添加到此双端队列
void putLast(E e) throws InterruptedException
e
- 要添加的元素
InterruptedException
- 如果在等待时被中断
ClassCastException
- 如果指定元素的类不允许它被添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某个属性不允许它被添加到此双端队列
boolean offerFirst(E e, long timeout, TimeUnit unit) throws InterruptedException
e
- 要添加的元素
timeout
- 放弃之前等待的时间长度,以
unit 为时间单位
unit
- 确定如何解释
timeout 参数的
TimeUnit
InterruptedException
- 如果在等待时被中断
ClassCastException
- 如果指定元素的类不允许它被添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某个属性不允许它被添加到此双端队列
boolean offerLast(E e, long timeout, TimeUnit unit) throws InterruptedException
e
- 要添加的元素
timeout
- 放弃之前等待的时间长度,以
unit 为时间单位
unit
- 确定如何解释
timeout 参数的
TimeUnit
InterruptedException
- 如果在等待时被中断
ClassCastException
- 如果指定元素的类不允许它被添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某个属性不允许它被添加到此双端队列
E takeFirst() throws InterruptedException
InterruptedException
- 如果在等待时被中断
E takeLast() throws InterruptedException
InterruptedException
- 如果在等待时被中断
E pollFirst(long timeout, TimeUnit unit) throws InterruptedException
timeout
- 放弃之前等待的时间长度,以
unit 为时间单位
unit
- 确定如何解释
timeout 参数的
TimeUnit
InterruptedException
- 如果在等待时被中断
E pollLast(long timeout, TimeUnit unit) throws InterruptedException
timeout
- 放弃之前等待的时间长度,以
unit 为时间单位
unit
- 确定如何解释
timeout 参数的
TimeUnit
InterruptedException
- 如果在等待时被中断
boolean removeFirstOccurrence(Object o)
Deque<E>
中的
removeFirstOccurrence
o
- 要从此双端队列移除的元素(如果存在)
ClassCastException
- 如果指定元素的类与此双端队列不兼容(可选)
NullPointerException
- 如果指定的元素为 null(可选)
boolean removeLastOccurrence(Object o)
Deque<E>
中的
removeLastOccurrence
o
- 要从此双端队列移除的元素(如果存在)
ClassCastException
- 如果指定元素的类与此双端队列不兼容(可选)
NullPointerException
- 如果指定的元素为 null(可选)
boolean add(E e)
offer
。
此方法等效于 addLast
。
e
- 要添加的元素
Collection.add(E)
的规定)
IllegalStateException
- 如果由于容量限制此时不能添加该元素
ClassCastException
- 如果指定元素的类不允许它被添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某个属性不允许它被添加到此双端队列
boolean offer(E e)
add(E)
方法,后者可能无法插入元素,而只是抛出一个异常。
此方法等效于 offerLast
。
e
- 要添加的元素
ClassCastException
- 如果指定元素的类不允许它被添加到此双端队列
NullPointerException
- 如果指定的元素为 null
IllegalArgumentException
- 如果指定元素的某个属性不允许它被添加到此双端队列
void put(E e) throws InterruptedException
此方法等效于 putLast
。
BlockingQueue<E>
中的
put
e
- 要添加的元素
InterruptedException
- 如果在等待时被中断
ClassCastException
- 如果指定元素的类不允许它被添加到此双端队列
NullPointerException
-