Класс ConcurrentLinkedQueue<E>
- java.lang.Object
-
- java.util.AbstractCollection<E>
-
- java.util.AbstractQueue<E>
-
- java.util.concurrent.ConcurrentLinkedQueue<E>
- Type Parameters:
-
E- тип элементов, хранящихся в этой очереди
- Все реализуемые интерфейсы:
-
Serializable,Iterable<E>,Collection<E>,Queue<E>
public class ConcurrentLinkedQueue<E> extends AbstractQueue<E> implements Queue<E>, Serializable
Безопасная для потоков неограниченная очередь очередь, основанная на связанных узлах. Эта очередь упорядочивает элементы в порядке FIFO (первым вошел, первым вышел). Голова очереди — это элемент, который находится в очереди дольше всего. Хвост очереди — это элемент, который находится в очереди меньше всего времени. Новые элементы вставляются в хвост очереди, а операции извлечения из очереди получают элементы в голове очереди. Очередь является подходящим выбором, когда множественные потоки будут совместно использовать доступ к общему набору. Как и большинство других реализаций коллекций для многопоточных приложений, этот класс не допускает использование null элементов.
Эта реализация использует эффективный неблокирующий алгоритм, основанный на алгоритме, описанном в Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms Магедом М. Михаилом и Майклом Л. Скоттом.
Итераторы являются слабо согласованными, возвращая элементы, отражающие состояние очереди в какой-то момент во время или после создания итератора. Они не выбрасывают ConcurrentModificationException, и могут выполняться параллельно с другими операциями. Элементы, присутствующие в очереди с момента создания итератора, будут возвращены ровно один раз.
Следует учитывать, что, в отличие от большинства коллекций, метод size является НЕ операцией с постоянной сложностью. Из-за асинхронной природы этих очередей определение текущего количества элементов требует обхода элементов, поэтому может сообщать неточные результаты, если эта коллекция изменяется во время обхода.
Массовые операции, добавляющие, удаляющие или проверяющие несколько элементов, такие как addAll(java.util.Collection<? extends E>), removeIf(java.util.function.Predicate<? super E>) или forEach(java.util.function.Consumer<? super E>), не гарантируют атомарное выполнение. Например, обход forEach параллельно с операцией
addAll может наблюдать только некоторые добавленные элементы.
Этот класс и его итератор реализуют все необязательные методы интерфейсов Queue и Iterator.
Эффекты согласованности памяти: Как и в других коллекциях для многопоточных приложений, действия в потоке до помещения объекта в ConcurrentLinkedQueue происходят раньше последующих действий по доступу или удалению этого элемента из ConcurrentLinkedQueue в другом потоке.
Этот класс является членом Java Collections Framework.
- С тех пор:
- 1.5
- См. также:
- Сериализованная форма
Конструкторы
| Конструктор | Описание |
|---|---|
ConcurrentLinkedQueue() | Создаёт |
ConcurrentLinkedQueue(Collection<? extends E> c) | Создаёт |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
boolean | add(E e) | Вставляет указанный элемент в конец этой очереди. |
boolean | addAll(Collection<? extends E> c) | Добавляет все элементы из указанной коллекции в конец этой очереди в порядке, определенном итератором указанной коллекции. |
boolean | contains(Object o) | Возвращает |
void | forEach(Consumer<? super E> action) | Выполняет заданное действие для каждого элемента |
boolean | isEmpty() | Возвращает |
Iterator<E> | iterator() | Возвращает итератор по элементам в этой очереди в правильной последовательности. |
boolean | offer(E e) | Вставляет указанный элемент в конец этой очереди. |
boolean | remove(Object o) | Удаляет единственный экземпляр указанного элемента из этой очереди, если он присутствует. |
boolean | removeAll(Collection<?> c) | Удаляет все элементы этой коллекции, которые также содержатся в указанной коллекции (необязательная операция). |
boolean | removeIf(Predicate<? super E> filter) | Удаляет все элементы этой коллекции, удовлетворяющие заданному предикату. |
boolean | retainAll(Collection<?> c) | Оставляет только элементы в этой коллекции, которые содержатся в указанной коллекции (необязательная операция). |
int | size() | Возвращает количество элементов в этой очереди. |
Spliterator<E> | spliterator() | Возвращает |
Object[] | toArray() | Возвращает массив, содержащий все элементы в этой очереди в правильной последовательности. |
<T> T[] | toArray(T[] a) | Возвращает массив, содержащий все элементы в этой очереди в правильной последовательности; тип возвращаемого массива соответствует указанному массиву. |
Методы, объявленные в классе java.util.AbstractQueue
clear, element, remove Методы, объявленные в классе java.util.AbstractCollection
containsAll, toString Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Методы, объявленные в интерфейсе java.util.Collection
clear, containsAll, equals, hashCode, parallelStream, stream, toArray Методы, объявленные в интерфейсе java.util.Queue
element, peek, poll, remove Конструкторы
ConcurrentLinkedQueue
public ConcurrentLinkedQueue()
Создаёт ConcurrentLinkedQueue , которая изначально пуста.
ConcurrentLinkedQueue
public ConcurrentLinkedQueue(Collection<? extends E> c)
Создаёт ConcurrentLinkedQueue , изначально содержащую элементы заданной коллекции, добавленные в порядке обхода итератора коллекции.
- Параметры:
-
c- коллекция элементов, которые изначально должны содержаться - Исключения:
-
NullPointerException- если указанная коллекция или любой из её элементов равны null
Методы
add
public boolean add(E e)
Вставляет указанный элемент в конец этой очереди. Поскольку очередь неограничена, этот метод никогда не выбросит IllegalStateException или не вернёт false.
- Указано:
-
addв интерфейсеCollection<E> - Указано:
-
addв интерфейсеQueue<E> - Переопределяет:
-
addв классеAbstractQueue<E> - Параметры:
-
e- элемент для добавления - Возвращает:
-
true(как указано вCollection.add(E)) - Выбрасывает:
-
NullPointerException- если указанный элемент равен null
offer
public boolean offer(E e)
Вставляет указанный элемент в конец этой очереди. Поскольку очередь неограничена, этот метод никогда не вернёт false.
- Указано:
-
offerв интерфейсеQueue<E> - Параметры:
-
e- элемент для добавления - Возвращает:
-
true(как указано вQueue.offer(E)) - Выбрасывает:
-
NullPointerException- если указанный элемент равен null
isEmpty
public boolean isEmpty()
Возвращает true , если эта очередь не содержит элементов.
- Указано:
-
isEmptyв интерфейсеCollection<E> - Переопределяет:
-
isEmptyв классеAbstractCollection<E> - Возвращает:
-
true, если эта очередь не содержит элементов
size
public int size()
Возвращает количество элементов в этой очереди. Если эта очередь содержит более Integer.MAX_VALUE элементов, возвращает Integer.MAX_VALUE.
Обратите внимание, что, в отличие от большинства коллекций, этот метод НЕ является операцией с постоянной сложностью. Из-за асинхронной природы этих очередей определение текущего количества элементов требует обхода O(n). Кроме того, если элементы добавляются или удаляются во время выполнения этого метода, возвращаемый результат может быть неточным. Таким образом, этот метод обычно не очень полезен в многопоточных приложениях.
- Указано:
-
sizeв интерфейсеCollection<E> - Возвращает:
- количество элементов в этой очереди
contains
public boolean contains(Object o)
Возвращает true , если эта очередь содержит указанный элемент. Более формально, возвращает true тогда и только тогда, когда эта очередь содержит по крайней мере один элемент e такой, что o.equals(e).
- Указано:
-
containsв интерфейсеCollection<E> - Переопределяет:
-
containsв классеAbstractCollection<E> - Параметры:
-
o- объект, для проверки наличия в этой очереди - Возвращает:
-
true, если эта очередь содержит указанный элемент
remove
public boolean remove(Object o)
Удаляет один экземпляр указанного элемента из этой очереди, если он присутствует. Более формально, удаляет элемент e такой, что o.equals(e), если эта очередь содержит один или несколько таких элементов. Возвращает true , если эта очередь содержала указанный элемент (или, что эквивалентно, если эта очередь изменилась в результате вызова).
- Указано:
-
removeв интерфейсеCollection<E> - Переопределяет:
-
removeв классеAbstractCollection<E> - Параметры:
-
o- элемент для удаления из этой очереди, если он присутствует - Возвращает:
-
true, если эта очередь изменилась в результате вызова
addAll
public boolean addAll(Collection<? extends E> c)
Добавляет все элементы из указанной коллекции в конец этой очереди в порядке, в котором они возвращаются итератором указанной коллекции. Попытки addAll очереди к самой себе приведут к IllegalArgumentException.
- Указано:
-
addAllв интерфейсеCollection<E> - Переопределяет:
-
addAllв классеAbstractQueue<E> - Параметры:
-
c- элементы, которые необходимо вставить в эту очередь - Возвращает:
-
true, если эта очередь изменилась в результате вызова - Выбрасывает:
-
NullPointerException- если указанная коллекция или любой из её элементов равны null -
IllegalArgumentException- если коллекция является этой очередью - См. также:
AbstractQueue.add(Object)
toArray
public Object[] toArray()
Возвращает массив, содержащий все элементы в этой очереди в правильной последовательности.
Возвращаемый массив будет «безопасным» в том смысле, что к нему не сохраняются ссылки из этой очереди. (Другими словами, этот метод должен выделить новый массив). Таким образом, вызывающий метод свободен изменять возвращаемый массив.
Этот метод служит мостом между основанными на массивах и основанными на коллекциях API.
- Указано:
-
toArrayв интерфейсеCollection<E> - Переопределяет:
-
toArrayв классеAbstractCollection<E> - Возвращает:
- массив, содержащий все элементы в этой очереди
toArray
public <T> T[] toArray(T[] a)
Возвращает массив, содержащий все элементы в этой очереди в правильной последовательности; тип выполнения возвращаемого массива — тип указанного массива. Если очередь помещается в указанный массив, она возвращается в нём. В противном случае выделяется новый массив с типом выполнения указанного массива и размером этой очереди.
Если эта очередь помещается в указанный массив с избытком места (т. е. массив имеет больше элементов, чем эта очередь), элемент в массиве непосредственно после конца очереди устанавливается в null.
Как и метод toArray(), этот метод служит мостом между основанными на массивах и основанными на коллекциях API. Кроме того, этот метод позволяет точно управлять типом выполнения выходного массива и в определённых ситуациях может использоваться для экономии расходов на выделение памяти.
Предположим, что x — это очередь, которая, как известно, содержит только строки. Следующий код может быть использован для выгрузки очереди в новый выделенный массив String:
String[] y = x.toArray(new String[0]);Обратите внимание, что
toArray(new Object[0]) идентичен по функциональности toArray().- Указано:
-
toArrayв интерфейсеCollection<E> - Переопределяет:
-
toArrayв классеAbstractCollection<E> - Параметры типа:
-
T- компонентный тип массива, содержащего коллекцию - Параметры:
-
a- массив, в который должны быть помещены элементы очереди, если он достаточно большой; в противном случае для этой цели выделяется новый массив того же типа выполнения - Возвращает:
- массив, содержащий все элементы в этой очереди
- Выбрасывает:
-
ArrayStoreException- если тип выполнения указанного массива не является супертипом типа выполнения каждого элемента в этой очереди -
NullPointerException- если указанный массив равен null
iterator
public Iterator<E> iterator()
Возвращает итератор по элементам в этой очереди в правильной последовательности. Элементы будут возвращаться в порядке от первого (головки) до последнего (хвоста).
Возвращаемый итератор является слабо согласованным.
- Указано:
-
iteratorв интерфейсеCollection<E> - Указано:
-
iteratorв интерфейсеIterable<E> - Указано:
-
iteratorв классеAbstractCollection<E> - Возвращает:
- итератор по элементам в этой очереди в правильной последовательности
spliterator
public Spliterator<E> spliterator()
Возвращает Spliterator по элементам в этой очереди.
Возвращаемый разделитель является слабо согласованным.
Разделитель Spliterator сообщает о Spliterator.CONCURRENT, Spliterator.ORDERED и Spliterator.NONNULL.
- Указано:
-
spliteratorв интерфейсеCollection<E> - Указано:
-
spliteratorв интерфейсеIterable<E> - Примечание реализации:
SpliteratorреализуетtrySplitдля обеспечения ограниченной параллельности.- Возвращает:
Spliteratorпо элементам в этой очереди- С тех пор:
- 1.8
removeIf
public boolean removeIf(Predicate<? super E> filter)
Описание скопировано из интерфейса: Collection
Удаляет все элементы этой коллекции, которые удовлетворяют заданному предикату. Ошибки или исключения времени выполнения, выброшенные во время итерации или предикатом, передаются вызывающему методу.
- Указано:
-
removeIfв интерфейсеCollection<E> - Параметры:
-
filter- предикат, возвращающийtrueдля элементов, которые должны быть удалены - Возвращает:
-
true, если какие-либо элементы были удалены - Выбрасывает:
-
NullPointerException- если указанный фильтр равен null
removeAll
public boolean removeAll(Collection<?> c)
Описание скопировано из класса: AbstractCollection
Удаляет все элементы этой коллекции, которые также содержатся в указанной коллекции (необязательная операция). После возврата этого вызова эта коллекция не будет содержать элементов, общих с указанной коллекцией.
- Указано:
-
removeAllв интерфейсеCollection<E> - Переопределяет:
-
removeAllв классеAbstractCollection<E> - Параметры:
-
c— коллекция, содержащая элементы, которые необходимо удалить из этой коллекции - Возвращает:
-
true, если эта коллекция изменилась в результате вызова - Выбрасывает:
-
NullPointerException— если эта коллекция содержит один или несколько элементов null, а указанная коллекция не поддерживает элементы null (необязательно), или если указанная коллекция равна null - См. также:
-
AbstractCollection.remove(Object),AbstractCollection.contains(Object)
retainAll
public boolean retainAll(Collection<?> c)
Описание, скопированное из класса: AbstractCollection
Оставляет только элементы в этой коллекции, которые содержатся в указанной коллекции (необязательная операция). Другими словами, удаляет из этой коллекции все элементы, которые не содержатся в указанной коллекции.
- Указано:
-
retainAllв интерфейсеCollection<E> - Переопределяет:
-
retainAllв классеAbstractCollection<E> - Параметры:
-
c— коллекция, содержащая элементы, которые должны быть сохранены в этой коллекции - Возвращает:
-
true, если эта коллекция изменилась в результате вызова - Выбрасывает:
-
NullPointerException— если эта коллекция содержит один или несколько элементов null, а указанная коллекция не допускает элементы null (необязательно), или если указанная коллекция равна null - См. также:
-
AbstractCollection.remove(Object),AbstractCollection.contains(Object)
forEach
public void forEach(Consumer<? super E> action)
Описание, скопированное из интерфейса: Iterable
Выполняет заданное действие для каждого элемента Iterable до тех пор, пока все элементы не будут обработаны или действие не выбросит исключение. Действия выполняются в порядке итерации, если этот порядок указан. Исключения, выброшенные действием, передаются вызывающей стороне.
Поведение этого метода не определено, если действие выполняет побочные эффекты, которые изменяют базовый источник элементов, за исключением случаев, когда в переопределяемом классе указана политика одновременного изменения.
- Указано:
-
forEachв интерфейсеIterable<E> - Параметры:
-
action— действие, которое должно выполняться для каждого элемента - Выбрасывает:
-
NullPointerException— если указанное действие равно null
© 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/ConcurrentLinkedQueue.html