У цьому посібнику ми дізнаємося про інтерфейс 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)
Ось,
- value - це елемент, який потрібно вставити в чергу
- І ми встановили час очікування 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
розглядається як потокобезпечна колекція. Це тому, що це може бути корисним у багатопотокових операціях.
Припустимо, один потік вставляє елементи до черги, а інший потік видаляє елементи з черги.
Тепер, якщо перший потік працює повільніше, то черга блокування може змусити другий потік зачекати, поки перший потік завершить свою роботу.