English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы изучим интерфейс Java BlockingQueue и его методы.
Интерфейс BlockingQueue в фреймворке Java Collections расширяет интерфейс Queue. Он позволяет любым операциям ждать до успешного выполнения.
Например, если мы хотим удалить элемент из пустой очереди, блокирующая очередь позволяет операции удаления ждать, пока в очереди не появится несколько элементов для удаления.
Поскольку BlockingQueue является интерфейсом, мы не можем предоставить его прямое реализация.
Чтобы использовать функции BlockingQueue, нам нужно использовать классы, реализующие его.
Чтобы использовать BlockingQueue,我们必须 импортировать пакет java.util.concurrent.BlockingQueue.
// Реализация Array для BlockingQueue BlockingQueue<String> animal1 = new ArraryBlockingQueue<>(); // Реализация LinkedList для BlockingQueue BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Здесь мы создаем объекты classes ArrayBlockingQueue и LinkedBlockingQueue animal1 и animal2. Эти объекты могут использовать функции интерфейса BlockingQueue.
В зависимости от того, полна или пуста очередь, методы блокирующей очереди можно разделить на 3 класса:
add() - вставляет элемент в конец блокирующей очереди. Если очередь заполнена, выбрасывается исключение.
element() - возвращает голову блокирующей очереди. Если очередь пуста, выбрасывается исключение.
remove() - удаляет элемент из блокирующей очереди. Если очередь пуста, выбрасывается исключение.
offer() - вставляет заданный элемент в конец блокирующей очереди. Если очередь заполнена, возвращается false.
peek() - возвращает голову блокирующей очереди. Если очередь пуста, возвращается null.
poll() - удаляет элемент из блокирующей очереди. Если очередь пуста, возвращается null.
offer() и poll()Более подробная информация
Методы offer() и poll() могут использоваться с timeout. Это означает, что мы можем передавать единицу времени в качестве параметра. Например,
offer(value, 100, milliseconds)}
Здесь,
value - это элемент, который нужно вставить в очередь
и мы установим таймаут в 100 миллисекунд
Это означает, что метод offer() попытается вставить элемент в блокирующую очередь в течение 100 миллисекунд. Если за 100 миллисекунд элемент не вставлен, метод вернет false.
Примечание:Кроме миллисекунд, мы можем использовать следующие единицы времени в методах offer() и poll(): дни, часы, минуты, секунды, микросекунды и наносекунды.
BlockingQueue также предоставляет некоторые методы для блокировки операций и ожидания, если очередь полна или пуста.
put() - Вставляет элемент в блокирующую очередь. Если очередь полна, он будет ждать, пока очередь освободится для вставки элемента.
take() - Снимает и возвращает элемент из блокирующей очереди. Если очередь пуста, он будет ждать, пока в очереди появится элемент, который нужно удалить.
Предположим, мы хотим вставить элемент в очередь. Если очередь полна, то метод put() будет ждать, пока очередь не освободится для вставки элемента.
Также, если мы хотим удалить элемент из очереди. Если очередь пуста, то метод take() будет ждать, пока очередь не содержит элемента, который нужно удалить.
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { //Создание блокирующей очереди с использованием ArrayBlockingQueue BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5); try { //Вставка элементов в блокирующую очередь numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); //Снятие элемента из блокирующей очереди int removedNumber = numbers.take(); System.out.println("Удаленный номер: " + removedNumber); } catch(Exception e) { e.getStackTrace(); } } }
Результат вывода
BlockingQueue: [2, 1, 3] Удаленный элемент: 2
Чтобы узнать больше информации о ArrayBlockingQueue, пожалуйста, посетитеJava ArrayBlockingQueue.
В Java BlockingQueue рассматривается как线程安全的коллекция. Это потому, что она может помочь в многонитевых операциях.
Предположим, что одна нить вставляет элементы в очередь, а другая нить удаляет элементы из очереди.
Теперь, если скорость выполнения первой нити медленнее, то блокирующая очередь позволяет второй нити ждать, пока первая нить не завершит свою операцию.