Spec-Zone.ru › OpenJDK 17

Интерфейс 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, в зависимости от операции), третья блокирует текущую нить неопределенно долго, пока операция не завершится успешно, и четвертая блокирует на заданный максимальный предел времени, прежде чем сдаться. Эти методы обобщены в следующей таблице:

Сводка методов BlockingQueue
Бросает исключение Специальное значение Блокирует Истекает время ожидания
Вставка 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.

С момента:
1.5

Сводка методов

Модификатор и тип Метод Описание
boolean add(E e)
Вставляет указанный элемент в эту очередь, если это возможно сделать немедленно без нарушения ограничений по емкости, возвращает true при успехе и бросает IllegalStateException , если в данный момент нет места.
boolean contains(Object o)
Возвращает true , если эта очередь содержит указанный элемент.
int drainTo(Collection<? super E> c)
Удаляет все доступные элементы из этой очереди и добавляет их в заданную коллекцию.
int drainTo(Collection<? super E> c, int maxElements)
Удаляет не более заданного количества доступных элементов из этой очереди и добавляет их в заданную коллекцию.
boolean offer(E e)
Вставляет указанный элемент в эту очередь, если это возможно сделать немедленно без нарушения ограничений по емкости, возвращает true при успехе и false , если в данный момент нет места.
boolean offer(E e, long timeout, TimeUnit unit)
Вставляет указанный элемент в эту очередь, ожидая в случае необходимости до заданного времени ожидания, пока освободится место.
E poll(long timeout, TimeUnit unit)
Извлекает и удаляет голову этой очереди, ожидая в случае необходимости до заданного времени ожидания, пока появится элемент.
void put(E e)
Вставляет указанный элемент в эту очередь, ожидая в случае необходимости, пока освободится место.
int remainingCapacity()
Возвращает количество дополнительных элементов, которые эта очередь может теоретически (при отсутствии ограничений на память или ресурсы) принять без блокировки, или Integer.MAX_VALUE , если нет внутренних ограничений.
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, 2021, 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/17/docs/api/java.base/java/util/concurrent/BlockingQueue.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API