Spec-Zone .ru
спецификации, руководства, описания, API
|
E
- тип элементов сохранен в этом наборе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(); } }
Эффекты непротиворечивости памяти: Как с другими параллельными наборами, действиями в потоке до размещения объекта в a BlockingQueue
произойдите - перед действиями, последующими за доступом или удалением того элемента от BlockingQueue
в другом потоке.
Этот интерфейс является элементом Платформы Наборов Java.
Модификатор и Тип | Метод и Описание |
---|---|
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()
Получает и удаляет главу этой очереди, ожидая в случае необходимости, пока элемент не становится доступным.
|
boolean add(E e)
offer
.add
в интерфейсе Collection<E>
add
в интерфейсе Queue<E>
e
- элемент, чтобы добавитьCollection.add(E)
)IllegalStateException
- если элемент не может быть добавлен в это время из-за ограничений емкостиClassCastException
- если класс указанного элемента препятствует тому, чтобы это было добавлено к этой очередиNullPointerException
- если указанный элемент является нулемIllegalArgumentException
- если некоторое свойство указанного элемента препятствует тому, чтобы это было добавлено к этой очередиboolean offer(E e)
add(E)
, который может быть не в состоянии вставить элемент только, выдавая исключение.offer
в интерфейсе Queue<E>
e
- элемент, чтобы добавитьClassCastException
- если класс указанного элемента препятствует тому, чтобы это было добавлено к этой очередиNullPointerException
- если указанный элемент является нулемIllegalArgumentException
- если некоторое свойство указанного элемента препятствует тому, чтобы это было добавлено к этой очередиvoid put(E e) throws InterruptedException
e
- элемент, чтобы добавитьInterruptedException
- если прервано, ожидаяClassCastException
- если класс указанного элемента препятствует тому, чтобы это было добавлено к этой очередиNullPointerException
- если указанный элемент является нулемIllegalArgumentException
- если некоторое свойство указанного элемента препятствует тому, чтобы это было добавлено к этой очередиboolean offer(E e, long timeout, TimeUnit unit) throws InterruptedException
e
- элемент, чтобы добавитьtimeout
- сколько времени ожидать перед отказом в модулях unitunit
- TimeUnit, определяющий, как интерпретировать параметр timeoutInterruptedException
- если прервано, ожидаяClassCastException
- если класс указанного элемента препятствует тому, чтобы это было добавлено к этой очередиNullPointerException
- если указанный элемент является нулемIllegalArgumentException
- если некоторое свойство указанного элемента препятствует тому, чтобы это было добавлено к этой очередиE take() throws InterruptedException
InterruptedException
- если прервано, ожидаяE poll(long timeout, TimeUnit unit) throws InterruptedException
timeout
- сколько времени ожидать перед отказом в модулях unitunit
- TimeUnit, определяющий, как интерпретировать параметр timeoutInterruptedException
- если прервано, ожидаяint remainingCapacity()
Отметьте, что невозможно всегда говорить, успешно выполнится ли попытка вставить элемент, осматривая remainingCapacity, потому что это может иметь место, что другой поток собирается вставить или удалить элемент.
boolean remove(Object o)
remove
в интерфейсе Collection<E>
o
- элемент, который будет удален из этой очереди, если существующийClassCastException
- если класс указанного элемента является несовместимым с этой (дополнительной) очередьюNullPointerException
- если указанный элемент является (дополнительным) нулемboolean contains(Object o)
contains
в интерфейсе Collection<E>
o
- объект, который будет проверен на включение в этой очередиClassCastException
- если класс указанного элемента является несовместимым с этой (дополнительной) очередьюNullPointerException
- если указанный элемент является (дополнительным) нулемint drainTo(Collection<? super E> c)
c
- набор, чтобы передать элементы вUnsupportedOperationException
- если добавление элементов не поддерживается указанным наборомClassCastException
- если класс элемента этой очереди препятствует тому, чтобы это было добавлено к указанному наборуNullPointerException
- если указанный набор является нулемIllegalArgumentException
- если указанный набор является этой очередью, или некоторое свойство элемента этой очереди препятствует тому, чтобы это было добавлено к указанному наборуint drainTo(Collection<? super E> c, int maxElements)
c
- набор, чтобы передать элементы вmaxElements
- максимальное количество элементов, чтобы передатьUnsupportedOperationException
- если добавление элементов не поддерживается указанным наборомClassCastException
- если класс элемента этой очереди препятствует тому, чтобы это было добавлено к указанному наборуNullPointerException
- если указанный набор является нулемIllegalArgumentException
- если указанный набор является этой очередью, или некоторое свойство элемента этой очереди препятствует тому, чтобы это было добавлено к указанному набору
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.