Интерфейс BlockingQueue<E>
- Параметры типа:
-
E- тип элементов, хранящихся в очереди
- Все суперинтерфейсы:
-
Collection<E>,Iterable<E>,Queue<E>
- Все известные подинтерфейсы:
-
BlockingDeque<E>,TransferQueue<E>
- Все известные реализующие классы:
-
ArrayBlockingQueue,DelayQueue,LinkedBlockingDeque,LinkedBlockingQueue,LinkedTransferQueue,PriorityBlockingQueue,SynchronousQueue
public interface BlockingQueue<E> extends Queue<E>
Очередь Queue, которая дополнительно поддерживает операции ожидания, пока очередь не станет непустой при извлечении элемента, и ожидание, пока освободится место в очереди при сохранении элемента.
BlockingQueue методы представлены в четырёх формах с различными способами обработки операций, которые не могут быть выполнены немедленно, но могут быть выполнены в какой-то момент в будущем: первая выбрасывает исключение, вторая возвращает специальное значение (либо null или false, в зависимости от операции), третья блокирует текущий поток неопределённо долго, пока операция не сможет завершиться успешно, а четвёртая блокирует только в течение заданного максимального лимита времени, прежде чем отказаться. Эти методы обобщены в следующей таблице:
| Выбрасывает исключение | Специальное значение | Блокирует | Истекает время | |
|---|---|---|---|---|
| Вставка | add(e) | offer(e) | put(e) | offer(e, time, unit) |
| Удаление | remove() | poll() | take() | poll(time, unit) |
| Просмотр | element() | peek() | не применимо | не применимо |
Очередь BlockingQueue не принимает null элементы. Реализации выбрасывают NullPointerException при попытках add, put или offer null. Значение null используется как контрольное значение для обозначения неудачи poll операций.
Очередь BlockingQueue может быть ограниченной по емкости. В любой момент времени она может иметь remainingCapacity предел, превысив который невозможно добавить дополнительные элементы put без блокировки. Очередь BlockingQueue без внутренних ограничений по емкости всегда сообщает о доступной емкости Integer.MAX_VALUE.
BlockingQueue реализации предназначены в первую очередь для очередей производитель-потребитель, но также поддерживают интерфейс Collection. Таким образом, например, возможно удалить произвольный элемент из очереди с помощью remove(x). Однако такие операции обычно не выполняются очень эффективно и предназначены только для периодического использования, например, когда очередное сообщение отменяется.
BlockingQueue реализации потокобезопасны. Все методы очереди достигают своих результатов атомарно, используя внутренние блокировки или другие формы управления конкурентностью. Однако массовые операции с коллекцией addAll, containsAll, retainAll и removeAll не обязательно выполняются атомарно, если иное не указано в реализации. Например, addAll(c) может завершиться ошибкой (выбросить исключение) после добавления только части элементов в c.
Очередь BlockingQueue не изначально поддерживает операции «закрыть» или «остановиться» для указания того, что больше элементов добавляться не будет. Потребность и использование таких функций зависят от реализации. Например, распространённым приёмом является вставка специальных объектов окончание потока или ядовитых объектов, которые интерпретируются соответствующим образом при их извлечении потребителями.
Пример использования, основанный на типичном сценарии производитель-потребитель. Обратите внимание, что очередь BlockingQueue безопасно использовать с несколькими производителями и несколькими потребителями.
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
class Setup {
void main() {
BlockingQueue q = new SomeQueueImplementation();
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
} Эффекты согласованности памяти: Как и в других коллекциях с параллельной работой, действия в потоке до размещения объекта в очереди BlockingQueue предшествуют действиям, последующим за доступом или удалением этого элемента из очереди BlockingQueue в другом потоке.
Этот интерфейс является частью Java Collections Framework.
- C момента:
- 1.5
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean | add(E e) | Добавляет указанный элемент в эту очередь, если это возможно немедленно без нарушения ограничений по емкости, возвращает |
boolean | contains(Object o) | Возвращает |
int | drainTo(Collection<? super E> c) | Удаляет все доступные элементы из этой очереди и добавляет их в заданную коллекцию. |
int | drainTo(Collection<? super E> c,
int maxElements) | Удаляет не более заданного числа доступных элементов из этой очереди и добавляет их в заданную коллекцию. |
boolean | offer(E e) | Добавляет указанный элемент в эту очередь, если это возможно немедленно без нарушения ограничений по емкости, возвращает |
boolean | offer(E e,
long timeout,
TimeUnit unit) | Добавляет указанный элемент в эту очередь, ожидая до указанного времени ожидания, если необходимо, для освобождения места. |
E | poll(long timeout,
TimeUnit unit) | Извлекает и удаляет голову этой очереди, ожидая до указанного времени ожидания, если необходимо, для появления элемента. |
void | put(E e) | Добавляет указанный элемент в эту очередь, ожидая, если необходимо, для освобождения места. |
int | remainingCapacity() | Возвращает количество дополнительных элементов, которые эта очередь может теоретически (в отсутствие ограничений памяти или ресурсов) принять без блокировки, или |
boolean | remove(Object o) | Удаляет один экземпляр указанного элемента из этой очереди, если он есть. |
E | take() | Извлекает и удаляет голову этой очереди, ожидая, если необходимо, пока появится элемент. |
Методы, объявленные в интерфейсе java.util.Collection
addAll, clear, containsAll, equals, hashCode, isEmpty, iterator, parallelStream, removeAll, removeIf, retainAll, size, spliterator, stream, toArray, toArray, toArray Методы, объявленные в интерфейсе java.lang.Iterable
forEach Методы, объявленные в интерфейсе java.util.Queue
element, peek, poll, remove Методы
add
boolean add(E e)
Вставляет указанный элемент в эту очередь, если это возможно сделать немедленно без нарушения ограничений по емкости, возвращая true при успехе и выбрасывая IllegalStateException , если в настоящее время нет места. При использовании очереди с ограниченной емкостью, обычно предпочтительнее использовать offer.
- Указано в:
-
addв интерфейсеCollection<E> - Указано в:
-
addв интерфейсеQueue<E> - Параметры:
-
e- элемент для добавления - Возвращает:
-
true(как указано вCollection.add(E)) - Исключения:
-
IllegalStateException- если элемент не может быть добавлен в данный момент из-за ограничений по емкости -
ClassCastException- если класс указанного элемента препятствует его добавлению в эту очередь -
NullPointerException- если указанный элемент равен null -
IllegalArgumentException- если какое-либо свойство указанного элемента препятствует его добавлению в эту очередь
offer
boolean offer(E e)
Вставляет указанный элемент в эту очередь, если это возможно сделать немедленно без нарушения ограничений по емкости, возвращая true при успехе и false , если в настоящее время нет места. При использовании очереди с ограниченной емкостью, этот метод, как правило, предпочтительнее add(E), который может не вставить элемент, только сбросив исключение.
- Указано в:
-
offerв интерфейсеQueue<E> - Параметры:
-
e- элемент для добавления - Возвращает:
-
true, если элемент был добавлен в эту очередь, иначеfalse - Исключения:
-
ClassCastException- если класс указанного элемента препятствует его добавлению в эту очередь -
NullPointerException- если указанный элемент равен null -
IllegalArgumentException- если какое-либо свойство указанного элемента препятствует его добавлению в эту очередь
put
void put(E e) throws InterruptedException
Вставляет указанный элемент в эту очередь, ожидая, если необходимо, пока освободится место.
- Параметры:
-
e- элемент для добавления - Исключения:
-
InterruptedException- если прервано во время ожидания -
ClassCastException- если класс указанного элемента препятствует его добавлению в эту очередь -
NullPointerException- если указанный элемент равен null -
IllegalArgumentException- если какое-либо свойство указанного элемента препятствует его добавлению в эту очередь
offer
boolean offer(E e,
long timeout,
TimeUnit unit)
throws InterruptedException Вставляет указанный элемент в эту очередь, ожидая до указанного времени ожидания, если необходимо, чтобы освободилось место.
- Параметры:
-
e- элемент для добавления -
timeout- сколько времени ожидать, прежде чем сдаться, в единицахunit -
unit-TimeUnitопределяющий, как интерпретировать параметрtimeout - Возвращает:
-
true, если успешно, илиfalse, если указанное время ожидания истекает, прежде чем освободится место - Исключения:
-
InterruptedException- если прервано во время ожидания -
ClassCastException- если класс указанного элемента препятствует его добавлению в эту очередь -
NullPointerException- если указанный элемент равен null -
IllegalArgumentException- если какое-либо свойство указанного элемента препятствует его добавлению в эту очередь
take
E take() throws InterruptedException
Извлекает и удаляет голову этой очереди, ожидая, если необходимо, пока элемент не станет доступным.
- Возвращает:
- голова этой очереди
- Исключения:
-
InterruptedException- если прервано во время ожидания
poll
E poll(long timeout,
TimeUnit unit)
throws InterruptedException Извлекает и удаляет голову этой очереди, ожидая до указанного времени ожидания, если необходимо, чтобы элемент стал доступным.
- Параметры:
-
timeout- сколько времени ожидать, прежде чем сдаться, в единицахunit -
unit-TimeUnit, определяющий, как интерпретировать параметрtimeout - Возвращает:
- голова этой очереди, или
null, если указанное время ожидания истекает, прежде чем элемент становится доступным - Исключения:
-
InterruptedException- если прервано во время ожидания
remainingCapacity
int remainingCapacity()
Возвращает количество дополнительных элементов, которые эта очередь может теоретически (при отсутствии ограничений памяти или ресурсов) принять без блокировки, или Integer.MAX_VALUE , если нет внутреннего ограничения.
Обратите внимание, что вы не всегда можете сказать, удастся ли попытка вставить элемент, посмотрев на remainingCapacity, потому что может произойти так, что другой поток собирается вставить или удалить элемент.
- Возвращает:
- остающуюся емкость
remove
boolean remove(Object o)
Удаляет единственный экземпляр указанного элемента из этой очереди, если он присутствует. Более формально, удаляет элемент e такой, что o.equals(e), если эта очередь содержит один или несколько таких элементов. Возвращает true , если эта очередь содержала указанный элемент (или, что эквивалентно, если эта очередь изменилась в результате вызова).
- Указано в:
-
removeв интерфейсеCollection<E> - Параметры:
-
o- элемент, который нужно удалить из этой очереди, если он присутствует - Возвращает:
-
true, если эта очередь изменилась в результате вызова - Исключения:
-
ClassCastException- если класс указанного элемента несовместим с этой очередью (необязательно) -
NullPointerException- если указанный элемент равен null (необязательно)
contains
boolean contains(Object o)
Возвращает true , если эта очередь содержит указанный элемент. Более формально, возвращает true тогда и только тогда, когда эта очередь содержит по крайней мере один элемент e такой, что o.equals(e).
- Указано в:
-
containsв интерфейсеCollection<E> - Параметры:
-
o- объект, который нужно проверить на наличие в этой очереди - Возвращает:
-
true, если эта очередь содержит указанный элемент - Исключения:
-
ClassCastException- если класс указанного элемента несовместим с этой очередью (необязательно) -
NullPointerException- если указанный элемент равен null (необязательно)
drainTo
int drainTo(Collection<? super E> c)
Удаляет все доступные элементы из этой очереди и добавляет их в заданный набор. Эта операция может быть более эффективной, чем многократное опросный этой очереди. Неисправность, возникшая при попытке добавить элементы в коллекцию c, может привести к тому, что элементы будут отсутствовать в обоих, в одном или в обоих наборах, когда будет выброшено соответствующее исключение. Попытки слить очередь в себя приводят к IllegalArgumentException. Кроме того, поведение этой операции не определено, если указанный набор модифицируется во время выполнения операции.
- Параметры:
-
c- набор для передачи элементов - Возвращает:
- количество переданных элементов
- Исключения:
-
UnsupportedOperationException- если добавление элементов не поддерживается заданным набором -
ClassCastException- если класс элемента этой очереди препятствует его добавлению в указанный набор -
NullPointerException- если указанный набор равен null -
IllegalArgumentException- если указанный набор является этой очередью, или какое-либо свойство элемента этой очереди препятствует его добавлению в указанный набор
drainTo
int drainTo(Collection<? super E> c,
int maxElements) Удаляет не более заданного количества доступных элементов из этой очереди и добавляет их в заданный набор. Неисправность, возникшая при попытке добавить элементы в коллекцию c, может привести к тому, что элементы будут отсутствовать в обоих, в одном или в обоих наборах, когда будет выброшено соответствующее исключение. Попытки слить очередь в себя приводят к IllegalArgumentException. Кроме того, поведение этой операции не определено, если указанный набор модифицируется во время выполнения операции.
- Параметры:
-
c- набор для передачи элементов -
maxElements- максимальное количество элементов для передачи - Возвращает:
- количество переданных элементов
- Исключения:
-
UnsupportedOperationException- если добавление элементов не поддерживается заданным набором -
ClassCastException- если класс элемента этой очереди препятствует его добавлению в указанный набор -
NullPointerException- если указанный набор равен null -
IllegalArgumentException- если указанный набор является этой очередью, или какое-либо свойство элемента этой очереди препятствует его добавлению в указанный набор
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/BlockingQueue.html