Spec-Zone.ru › OpenJDK 21

Интерфейс 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 Collections Framework.

С тех пор:
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, 2023, 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/21/docs/api/java.base/java/util/concurrent/BlockingQueue.html

Spec-Zone.ru

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