Интерфейс 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.
- С момента:
- 1.5
Сводка методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean |
add |
Вставляет указанный элемент в эту очередь, если это возможно сделать немедленно без нарушения ограничений по емкости, возвращает true при успехе и бросает IllegalStateException , если в данный момент нет места. |
boolean |
contains |
Возвращает true , если эта очередь содержит указанный элемент. |
int |
drainTo |
Удаляет все доступные элементы из этой очереди и добавляет их в заданную коллекцию. |
int |
drainTo |
Удаляет не более заданного количества доступных элементов из этой очереди и добавляет их в заданную коллекцию. |
boolean |
offer |
Вставляет указанный элемент в эту очередь, если это возможно сделать немедленно без нарушения ограничений по емкости, возвращает true при успехе и false , если в данный момент нет места. |
boolean |
offer |
Вставляет указанный элемент в эту очередь, ожидая в случае необходимости до заданного времени ожидания, пока освободится место. |
E |
poll |
Извлекает и удаляет голову этой очереди, ожидая в случае необходимости до заданного времени ожидания, пока появится элемент. |
void |
put |
Вставляет указанный элемент в эту очередь, ожидая в случае необходимости, пока освободится место. |
int |
remainingCapacity() |
Возвращает количество дополнительных элементов, которые эта очередь может теоретически (при отсутствии ограничений на память или ресурсы) принять без блокировки, или Integer.MAX_VALUE , если нет внутренних ограничений. |
boolean |
remove |
Удаляет единственный экземпляр указанного элемента из этой очереди, если он присутствует. |
E |
take() |
Извлекает и удаляет голову этой очереди, ожидая в случае необходимости, пока появится элемент. |
Методы, объявленные в интерфейсе java.util.Collection
addAll, clear, containsAll, equals, hashCode, isEmpty, iterator, parallelStream, removeAll, removeIf, retainAll, size, spliterator, stream, toArray, toArray, toArray
Подробности методов
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