В этом руководстве мы узнаем об интерфейсе Java BlockingQueue и его методах.
BlockingQueue
Интерфейс Java Collections
рамки расширяет Queue
интерфейс. Это позволяет любой операции ждать, пока она не будет успешно выполнена.
Например, если мы хотим удалить элемент из пустой очереди, то блокирующая очередь позволяет операции удаления ждать, пока в очереди не появятся некоторые удаляемые элементы.
Классы, реализующие BlockingQueue
Поскольку BlockingQueue
это интерфейс, мы не можем предоставить его прямую реализацию.
Чтобы использовать функциональные возможности класса BlockingQueue
, нам нужно использовать классы, которые его реализуют.
- ArrayBlockingQueue
- LinkedBlockingQueue
Как использовать очереди с блокировкой?
Мы должны импортировать java.util.concurrent.BlockingQueue
пакет, чтобы использовать BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Здесь мы создали объекты animal1 и animal2 классов ArrayBlockingQueue
и LinkedBlockingQueue
соответственно. Эти объекты могут использовать функции BlockingQueue
интерфейса.
Методы BlockingQueue
В зависимости от того, заполнена очередь или пуста, методы блокировки очереди можно разделить на 3 категории:
Методы, вызывающие исключение
add()
- Вставляет элемент в очередь блокировки в конце очереди. Выдает исключение, если очередь заполнена.element()
- Возвращает заголовок очереди блокировки. Выдает исключение, если очередь пуста.remove()
- Удаляет элемент из очереди блокировки. Выдает исключение, если очередь пуста.
Методы, возвращающие какое-то значение
offer()
- Вставляет указанный элемент в очередь блокировки в конце очереди. Возвращает,false
если очередь заполнена.peek()
- Возвращает заголовок очереди блокировки. Возвращает,null
если очередь пуста.poll()
- Удаляет элемент из очереди блокировки. Возвращает,null
если очередь пуста.
Подробнее о предложениях () и опросах ()
Метод offer()
and 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 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) Удаленный элемент: 2
Чтобы узнать больше ArrayBlockingQueue
, посетите Java ArrayBlockingQueue.
Почему BlockingQueue?
В Java BlockingQueue
считается поточно-ориентированной коллекцией. Это потому, что это может быть полезно в многопоточных операциях.
Предположим, один поток вставляет элементы в очередь, а другой поток удаляет элементы из очереди.
Теперь, если первый поток работает медленнее, то очередь блокировки может заставить второй поток ждать, пока первый поток не завершит свою работу.