Очередь блокировки Java
Очередь блокировки Java
В этом руководстве мы узнаем об интерфейсе Java BlockingQueue и его методах.
BlockingQueue
интерфейс Java Collections
framework расширяет Queue
интерфейс. Это позволяет любой операции ждать, пока она не будет успешно выполнена.
Например, если мы хотим удалить элемент из пустой очереди, то блокирующая очередь позволяет операции удаления ждать, пока в очереди не появятся элементы для удаления.
<час>Классы, реализующие BlockingQueue
С BlockingQueue
является интерфейсом, мы не можем предоставить его прямую реализацию.
Чтобы использовать функциональные возможности BlockingQueue
, нам нужно использовать классы, которые его реализуют.
- Очередь блокирования массива
- Связанная очередь блокировки
<час>
Как использовать блокирующие очереди?
Мы должны импортировать java.util.concurrent.BlockingQueue
package для использования BlockingQueue
.
// Array implementation of BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
// LinkedList implementation of BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Здесь мы создали объекты animal1 и животное2 классов ArrayBlockingQueue
и LinkedBlockingQueue
, соответственно. Эти объекты могут использовать функциональные возможности BlockingQueue
интерфейс.
Методы блокировки очереди
В зависимости от того, заполнена очередь или пуста, методы блокировки очереди можно разделить на 3 категории:
Методы, вызывающие исключение
add()
- Вставляет элемент в очередь блокировки в конце очереди. Выдает исключение, если очередь заполнена.element()
- Возвращает голову очереди блокировки. Выдает исключение, если очередь пуста.remove()
- Удаляет элемент из очереди блокировки. Выдает исключение, если очередь пуста.
Методы, возвращающие некоторое значение
offer()
- Вставляет указанный элемент в очередь блокировки в конец очереди. Возвращаетfalse
если очередь заполнена.peek()
- Возвращает голову очереди блокировки. Возвращаетnull
если очередь пуста.poll()
- Удаляет элемент из очереди блокировки. Возвращаетnull
если очередь пуста.
Подробнее о offer() и poll()
offer()
и poll()
метод можно использовать с тайм-аутами. То есть мы можем передавать единицы времени в качестве параметра. Например,
offer(value, 100, milliseconds)
Здесь
- значение элемент, который нужно вставить в очередь
- Мы установили тайм-аут в 100 миллисекунд.
Это означает, что offer()
метод попытается вставить элемент в очередь блокировки для 100
миллисекунды. Если элемент не может быть вставлен за 100 миллисекунд, метод возвращает false
.
Примечание. Вместо milliseconds
, мы также можем использовать эти единицы времени:days
, hours
, minutes
, seconds
, microseconds
и nanoseconds
в offer()
и poll()
методы.
Методы, блокирующие операцию
BlockingQueue
также предоставляет методы для блокировки операций и ожидания, если очередь заполнена или пуста.
put()
- Вставляет элемент в очередь блокировки. Если очередь заполнена, она будет ждать, пока в очереди не останется места для вставки элемента.take()
- Удаляет и возвращает элемент из очереди блокировки. Если очередь пуста, она будет ждать, пока в очереди не появятся элементы для удаления.
Предположим, мы хотим вставить элементы в очередь. Если очередь заполнена, то put()
будет ждать, пока в очереди не останется места для вставки элементов.
Точно так же, если мы хотим удалить элементы из очереди. Если очередь пуста, то take()
метод будет ждать, пока в очереди не появятся элементы для удаления.
Реализация BlockingQueue в ArrayBlockingQueue
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
class Main {
public static void main(String[] args) {
// Create a blocking queue using the ArrayBlockingQueue
BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5);
try {
// Insert element to blocking queue
numbers.put(2);
numbers.put(1);
numbers.put(3);
System.out.println("BLockingQueue: " + numbers);
// Remove Elements from blocking queue
int removedNumber = numbers.take();
System.out.println("Removed Number: " + removedNumber);
}
catch(Exception e) {
e.getStackTrace();
}
}
}
Вывод
BlockingQueue: [2, 1, 3] Removed Element: 2
Чтобы узнать больше о ArrayBlockingQueue
, посетите Java ArrayBlockingQueue.
Почему BlockingQueue?
В Java BlockingQueue
считается поточно-ориентированным коллекция. Это потому, что это может быть полезно в многопоточных операциях.
Предположим, что один поток вставляет элементы в очередь, а другой поток удаляет элементы из очереди.
Теперь, если первый поток работает медленнее, то очередь блокировки может заставить второй поток ждать, пока первый поток не завершит свою работу.
java