English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы будем изучать класс ArrayBlockingQueue и его методы с помощью примеров.
Класс ArrayBlockingQueue в фреймворке Java Collections предоставляет реализацию блокирующей очереди с использованием массива.
Он реализуетJava интерфейс BlockingQueue.
Для создания массива блокирующей очереди необходимо импортировать пакет java.util.concurrent.ArrayBlockingQueue.
После импорта пакета можно использовать следующие методы для создания массива блокирующей очереди в Java:
ArrayBlockingQueue<Type> animal = new ArrayBlockingQueue<>(int capacity);
Здесь:
Type - тип массива блокирующей очереди
capacity - размер массива блокирующей очереди
Например,
//Создание массива блокирующей очереди размером 5 для типа String ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); //Создание массива блокирующей очереди размером 5 для типа Integer ArrayBlockingQueue<Integer> age = new ArrayBlockingQueue<>(5);
Примечание:Необходимо указать размер массива.
Класс ArrayBlockingQueue предоставляет реализацию всех методов интерфейса BlockingQueue.
Эти методы используются для вставки, доступа и удаления элементов из массива блокирующей очереди.Кроме того, мы рассмотрим два метода put() и take(), которые поддерживают блокирующие операции в массиве блокирующей очереди.
Эти методы отличают массив блокирующей очереди от других типов очередей.
add() - Вставляет заданный элемент в массив блокирующей очереди. Если очередь полна, выбрасывает исключение.
offer() - Вставляет заданный элемент в массив блокирующей очереди. Если очередь полна, возвращает false.
Например,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); //Использование add() animals.add("Dog"); animals.add("Cat"); //Использование offer() animals.offer("Horse"); System.out.println("ArrayBlockingQueue: " + animals); } }
Результат вывода
ArrayBlockingQueue: [Dog, Cat, Horse]
peek() - Возвращает элемент из начала массива блокирующей очереди. Если очередь пуста, возвращает null.
iterator() - Возвращает объект迭代атора, который позволяет последовательно访问 элементы массива блокирующей очереди. Если очередь пуста, выбрасывает исключение. Мы должны импортировать пакет java.util.Iterator, чтобы использовать его.
Например,
import java.util.concurrent.ArrayBlockingQueue; import java.util.Iterator; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); // Добавление элементов animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + animals); // Использование peek() String element = animals.peek(); System.out.println("Доступ к элементу: " + element); // Использование iterator() Iterator<String> iterate = animals.iterator(); System.out.print("Элементы ArrayBlockingQueue: "); while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
Результат вывода
ArrayBlockingQueue: [Dog, Cat, Horse] Доступ к элементу: Dog Элементы ArrayBlockingQueue: Dog, Cat, Horse,
remove() - Возвращает и удаляет указанный элемент из массива блокирующей очереди. Если очередь пуста, то выбрасывает исключение.
poll() - Возвращает и удаляет указанный элемент из массива блокирующей очереди. Если очередь пуста,则在озвращает null.
clear() - Удаляет все элементы из массива блокирующей очереди.
Например,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("ArrayBlockingQueue: " + animals); // Использование remove() String element1 = animals.remove(); System.out.println("Удаление элемента:"); System.out.println("Использование remove(): " + element1); // Использование poll() String element2 = animals.poll(); System.out.println("Использование poll(): " + element2); // Использование clear() animals.clear(); System.out.println("Обновленный ArrayBlockingQueue: " + animals); } }
Результат вывода
ArrayBlockingQueue: [Dog, Cat, Horse] Удаление элемента: Используя remove(): Dog Используя poll(): Cat Обновленный ArrayBlockingQueue: []
В многопоточных процессах мы можем использовать put() и take() для блокировки операции одного потока, чтобы синхронизировать его с другим потоком. Эти методы будут ждать, пока они не смогут успешно выполнить.
Чтобы добавить элемент в конец массива блокирующей очереди, можно использовать метод put().
Если массив блокирующей очереди полон, он будет ждать, пока в массиве блокирующей очереди не появится достаточно места для добавления элемента.
Например,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); try { //Добавление элементов в animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); } catch(Exception e) { System.out.println(e); } } }
Результат вывода
ArrayBlockingQueue: [Dog, Cat]
Здесь, если метод put() прерван в процессе ожидания, может быть выброшено исключение InterruptedException. Поэтому我们必须 его включить в блок try..catch.
Чтобы вернуть и удалить элемент из начала массива блокирующей очереди, мы можем использовать метод take().
Если массив блокирующей очереди пуст, он будет ждать, пока в массиве блокирующей очереди не появится элемент для удаления.
Например,
import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { ArrayBlockingQueue<String> animals = new ArrayBlockingQueue<>(5); try { //Добавление элементов в animals animals.put("Dog"); animals.put("Cat"); System.out.println("ArrayBlockingQueue: " + animals); //Удаление одного элемента String element = animals.take(); System.out.println("Удаленный элемент: " + element); } catch(Exception e) { System.out.println(e); } } }
Результат вывода
ArrayBlockingQueue: [Dog, Cat] Удаленный элемент: Dog
Здесь, если метод take() прерван в процессе ожидания, он выбрасывает исключение InterruptedException. Поэтому我们必须 его заключить в блок try...catch.
Методы | Описание содержимого |
---|---|
contains(element) | Поиск указанного элемента в массиве блокирующей очереди. |
size() | Возврат размера массива блокирующей очереди. |
toArray() | Преобразование массива блокирующей очереди в массив и возврат его. |
toString() | Преобразование массива блокирующей очереди в строку |
ArrayBlockingQueue использует массив в качестве своего внутреннего хранилища.
Это считается线程安全的сборник. Поэтому он обычно используется в многопоточных приложениях.
Предположим, что один поток вставляет элементы в очередь, а другой поток удаляет элементы из очереди.
Теперь, если первый поток slower, чем второй поток, то массив блокирующей очереди позволяет второму потоку ждать, пока первый поток не завершит свою операцию.