Класс ArrayBlockingQueue в Java
Класс ArrayBlockingQueue - это ограниченная очередь блокировки, поддерживаемая массивом. Под ограничением это означает, что размер очереди фиксирован. После создания емкость не может быть изменена. Попытки поместить элемент в полную очередь приведут к блокировке операции. Аналогичным образом будут заблокированы попытки взять элемент из пустой очереди. Ограниченность ArrayBlockingQueue может быть достигнута изначально, минуя емкость как параметр в конструкторе ArrayBlockingQueue. Эта очередь упорядочивает элементы FIFO (first-in-first-out) . Это означает, что заголовок этой очереди является самым старым элементом из элементов, присутствующих в этой очереди.
Хвостовая часть этой очереди является новейшим элементом элементов этой очереди. Вновь вставленные элементы всегда вставляются в конец очереди, и операции извлечения очереди получают элементы в начале очереди.
Этот класс и его итератор реализуют все дополнительные методы интерфейсов Collection и Iterator. Этот класс является членом Java Collections Framework.
Иерархия ArrayBlockingQueue

Этот класс расширяет AbstractQueue <E> и реализует интерфейсы Serializable , Iterable <E> , Collection <E> , BlockingQueue <E>, Queue <E>.
Декларация
public class ArrayBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, Serializable
Здесь E - это тип элементов, хранящихся в коллекции.
Конструкторы ArrayBlockingQueue
Здесь емкость размер очереди блокировки массива.
1. ArrayBlockingQueue (int capacity): создает ArrayBlockingQueue с заданной (фиксированной) емкостью и политикой доступа по умолчанию.
ArrayBlockingQueue<E> abq = new ArrayBlockingQueue<E>(int capacity);
2. ArrayBlockingQueue (int capacity, boolean fair): создает ArrayBlockingQueue с заданной (фиксированной) емкостью и указанной политикой доступа. Если текущее значение равно true, то доступ к очереди для потоков, заблокированных при вставке или удалении, обрабатывается в порядке FIFO; если false, порядок доступа не указан.
ArrayBlockingQueue<E> abq = new ArrayBlockingQueue<E>(int capacity, boolean fair);
3. ArrayBlockingQueue (int capacity, boolean fair, Collection c): создает ArrayBlockingQueue с заданной (фиксированной) емкостью, указанной политикой доступа и изначально содержит элементы данной коллекции, добавленные в порядке обхода итератора коллекции. Если текущее значение равно true, то доступ к очереди для потоков, заблокированных при вставке или удалении, обрабатывается в порядке FIFO; если false, порядок доступа не указан.
ArrayBlockingQueue<E> abq = new ArrayBlockingQueue<E>(int capacity, boolean fair, Collection c);
Example:
Java
// Java program to demonstrate // ArrayBlockingQueue(int initialCapacity)// constructor import java.util.concurrent.ArrayBlockingQueue; public class ArrayBlockingQueueDemo { public static void main(String[] args) { // define capacity of ArrayBlockingQueue int capacity = 15; // create object of ArrayBlockingQueue // using ArrayBlockingQueue(int initialCapacity) constructor ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<Integer>(capacity); // add numbers abq.add(1); abq.add(2); abq.add(3); // print queue System.out.println("ArrayBlockingQueue:" + abq); }} |
ArrayBlockingQueue:[1, 2, 3]
Basic Operations
1. Добавление элементов
The add(E e) method inserts the element passed as a parameter to the method at the tail of this queue. If adding the element exceeds the capacity of the queue then the method will throw an IllegalStateException. This method returns true if adding of the element is successful else it will throw an IllegalStateException.
Java
// Java Program to Demonstrate adding// elements to an ArrayBlockingQueue. import java.util.concurrent.ArrayBlockingQueue; public class AddingElementsExample { public static void main(String[] args) { // define capacity of ArrayBlockingQueue int capacity = 15; // create object of ArrayBlockingQueue ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<Integer>(capacity); // add numbers abq.add(1); abq.add(2); abq.add(3); // print queue System.out.println("ArrayBlockingQueue:" + abq); }} |
ArrayBlockingQueue:[1, 2, 3]
2. Удаление элементов
The remove(Object o) method removes a single instance of the specified element from this queue if it is present. We can say that method removes an element e such that o.equals(e) if this queue contains one or more such elements. Remove() method returns true if this queue contained the specified element which we want to remove.
Java
// Java program to demonstrate removal of // elements from an AbstractQueue import java.util.concurrent.ArrayBlockingQueue; public class RemovingElementsExample { public static void main(String[] args) { // define capacity of ArrayBlockingQueue int capacity = 15; // create object of ArrayBlockingQueue ArrayBlockingQueue<Integer> abq = new ArrayBlockingQueue<Integer>(capacity); // add numbers abq.add(1); abq.add(2); abq.add(3); // print queue System.out.println("ArrayBlockingQueue:" + abq); // remove 223 boolean response = abq.remove(2); // print Queue System.out.println("Removal of 2 :" + response); // print Queue System.out.println("queue contains " + abq); // remove all the elements abq.clear(); // print queue System.out.println("ArrayBlockingQueue:" + abq); }} |
ArrayBlockingQueue:[1, 2, 3] Removal of 2 :true queue contains [1, 3] ArrayBlockingQueue:[]
3. Доступ к элементам
The peek() method provided by the Queue interface is used to return the head of the queue. It retrieves but does not remove, the head of this queue. If the queue is empty then this method returns null.
Java
// Java program to demonstrate accessing// elements of ArrayBlockingQueue import java.util.concurrent.ArrayBlockingQueue; public class AccessingElementsExample { public static void main(String[] args) { // Define capacity of ArrayBlockingQueue int capacity = 5; // Create object of ArrayBlockingQueue ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(capacity); // Add element to ArrayBlockingQueue queue.add(23); queue.add(32); queue.add(45); queue.add(12); // Print queue after adding numbers System.out.println("After addding numbers queue is "); System.out.println(queue); // Print head of queue using peek() method System.out.println("Head of queue " + queue.peek()); }} |
After addding numbers queue is [23, 32, 45, 12] Head of queue 23
4. Перемещение
The iterator() method of ArrayBlockingQueue class is used to returns an iterator of the same elements as this queue in a proper sequence. The elements returned from this method contains elements in order from first(head) to last(tail). The returned iterator is weakly consistent.
Java
// Java Program to Demonstrate iterating// over ArrayBlockingQueue. import java.util.concurrent.ArrayBlockingQueue;import java.util.*; public class TraversingExample { public static void main(String[] args) { // Define capacity of ArrayBlockingQueue int capacity = 5; // Create object of ArrayBlockingQueue ArrayBlockingQueue<String> queue = new ArrayBlockingQueue<String>(capacity); // Add 5 elements to ArrayBlockingQueue queue.offer("User"); queue.offer("Employee"); queue.offer("Manager"); queue.offer("Analyst"); queue.offer("HR"); // Print queue System.out.println("Queue is " + queue); // Call iterator() method and Create an iterator Iterator iteratorValues = queue.iterator(); // Print elements of iterator System.out.println("
The iterator values:"); while (iteratorValues.hasNext()) { System.out.println(iteratorValues.next()); } }} |
Queue is [User, Employee, Manager, Analyst, HR] The iterator values: User Employee Manager Analyst HR
Methods of ArrayBlockingQueue
Здесь E - это тип элементов, содержащихся в этой коллекции. МЕТОД ОПИСАНИЕ добавить (E e) Вставляет указанный элемент в конец этой очереди, если это возможно сделать немедленно, не превышая емкость очереди, возвращая истину в случае успеха и генерируя исключение IllegalStateException, если эта очередь заполнена. Чисто() Атомарно удаляет все элементы из этой очереди. содержит (Объект o) Возвращает истину, если эта очередь содержит указанный элемент. DrainTo (Коллекция <? super E> c) Удаляет все доступные элементы из этой очереди и добавляет их в данную коллекцию. DrainTo (Коллекция <? super E> c, int maxElements) Удаляет не более указанного количества доступных элементов из этой очереди и добавляет их в данную коллекцию. forEach (действие Consumer <? super E>) Выполняет заданное действие для каждого элемента Iterable до тех пор, пока все элементы не будут обработаны или действие не вызовет исключение. итератор () Возвращает итератор по элементам в этой очереди в правильной последовательности. предложение (E e) Вставляет указанный элемент в конец этой очереди, если это возможно сделать немедленно, не превышая емкость очереди, возвращая истину в случае успеха и ложь, если эта очередь заполнена. предложение (E e, длительный тайм-аут, единица TimeUnit) Вставляет указанный элемент в конец этой очереди, ожидая до указанного времени ожидания, чтобы пространство стало доступным, если очередь заполнена. положить (E e) Вставляет указанный элемент в конец этой очереди, ожидая освобождения места, если очередь заполнена. оставшаяся емкость () Возвращает количество дополнительных элементов, которые эта очередь может идеально (при отсутствии ограничений памяти или ресурсов) принять без блокировки. удалить (Объект o) Удаляет единственный экземпляр указанного элемента из этой очереди, если он присутствует. removeAll (Коллекция <?> c) Удаляет все элементы этой коллекции, которые также содержатся в указанной коллекции (необязательная операция). removeIf (фильтр Predicate <? super E>) Удаляет все элементы этой коллекции, удовлетворяющие заданному предикату. keepAll (Коллекция <?> c) Сохраняет только те элементы в этой коллекции, которые содержатся в указанной коллекции (необязательная операция). размер() Возвращает количество элементов в этой очереди. сплитератор () Возвращает Spliterator по элементам в этой очереди. toArray () Возвращает массив, содержащий все элементы в этой очереди в правильной последовательности. toArray (T [] a) Возвращает массив, содержащий все элементы в этой очереди в правильной последовательности; тип среды выполнения возвращаемого массива - это тип указанного массива.
Методы, объявленные в классе java.util.AbstractQueue
МЕТОД | ОПИСАНИЕ |
|---|---|
| addAll (Коллекция <? extends E> c) | Добавляет все элементы в указанной коллекции в эту очередь. |
| элемент() | Извлекает, но не удаляет заголовок этой очереди. |
| Удалить() | Извлекает и удаляет заголовок этой очереди. |
Методы, объявленные в классе java.util.AbstractCollection
МЕТОД | ОПИСАНИЕ |
|---|---|
| containsAll (Коллекция <?> c) | Возвращает true, если эта коллекция содержит все элементы указанной коллекции. |
| пустой() | Возвращает true, если эта коллекция не содержит элементов. |
| нанизывать() | Возвращает строковое представление этой коллекции. |
Методы, объявленные в интерфейсе java.util.concurrent.BlockingQueue
МЕТОД | ОПИСАНИЕ |
|---|---|
| опрос (длинный таймаут, единица TimeUnit) | Извлекает и удаляет заголовок этой очереди, ожидая до указанного времени ожидания, если необходимо, чтобы элемент стал доступным. |
| брать() | Извлекает и удаляет заголовок этой очереди, при необходимости ожидая, пока элемент не станет доступным. |
Методы, объявленные в интерфейсе java.util.Collection
МЕТОД | ОПИСАНИЕ |
|---|---|
| addAll (Коллекция <? extends E> c) | Добавляет все элементы указанной коллекции в эту коллекцию (необязательная операция). |
| containsAll (Коллекция <?> c) | Возвращает true, если эта коллекция содержит все элементы указанной коллекции. |
| равно (Объект o) | Сравнивает указанный объект с этой коллекцией на равенство. |
| хэш-код() | Возвращает значение хэш-кода для этой коллекции. |
| пустой() | Возвращает true, если эта коллекция не содержит элементов. |
| parallelStream () | Возвращает возможно параллельный Stream с этой коллекцией в качестве источника. |
| транслировать() | Возвращает последовательный Stream с этой коллекцией в качестве источника. |
| toArray (генератор IntFunction <T []>) | Возвращает массив, содержащий все элементы в этой коллекции, используя предоставленную функцию генератора для выделения возвращенного массива. |
Методы, объявленные в интерфейсе java.util.Queue
МЕТОД | ОПИСАНИЕ |
|---|---|
| элемент() | Извлекает, но не удаляет заголовок этой очереди. |
| заглянуть () | Извлекает, но не удаляет заголовок этой очереди, или возвращает null, если эта очередь пуста. |
| опрос() | Извлекает и удаляет заголовок этой очереди или возвращает null, если эта очередь пуста. |
| Удалить() | Извлекает и удаляет заголовок этой очереди. |
Заключение: ArrayBlockingQueue обычно используется в поточно-ориентированной среде, где вы хотите заблокировать два или более, работающих с одним ресурсом, разрешив только один поток. Кроме того, мы можем заблокировать поток, используя ограничивающий коэффициент емкости.
Ссылка: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ArrayBlockingQueue.html
Вниманию читателя! Не переставай учиться сейчас. Ознакомьтесь со всеми важными концепциями Java Foundation и коллекций с помощью курса "Основы Java и Java Collections" по доступной для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .