Інтерфейс Java BlockingQueue

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

Припустимо, один потік вставляє елементи до черги, а інший потік видаляє елементи з черги.

Тепер, якщо перший потік працює повільніше, то черга блокування може змусити другий потік зачекати, поки перший потік завершить свою роботу.

Цікаві статті...