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