Java LinkedBlockingQueue

У цьому посібнику ми дізнаємося про клас LinkedBLockingQueue та його методи за допомогою прикладів.

LinkedBlockingQueueКлас Java Collectionsрамок забезпечує реалізацію блокування черги з використанням пов'язаного списку.

Він реалізує інтерфейс Java BlockingQueue.

Створення LinkedBlockingQueue

Для того, щоб створити пов'язану чергу блокування, ми повинні імпортувати java.util.concurrent.LinkedBlockingQueueпакет.

Ось як ми можемо створити пов'язану чергу блокування в Java:

1. Без початкової ємності

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Тут початковою ємністю за замовчуванням буде 2 31 -1.

2. З початковою місткістю

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Ось,

  • Тип - тип пов'язаної черги блокування
  • ємність - розмір пов'язаної черги блокування

Наприклад,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Примітка: Не обов’язково вказувати розмір пов’язаного списку.

Методи LinkedBlockingQueue

LinkedBlockingQueueКлас забезпечує реалізацію всіх методів в інтерфейсі BlockingQueue.

Ці методи використовуються для вставки, доступу та видалення елементів із пов'язаних черг блокування.

Крім того , ми дізнаємося про двох методах put()і take()цієї підтримки блокування роботи у зв'язаному блокує черзі.

Ці два методи відрізняють пов'язану чергу блокування від інших типових черг.

Вставити елементи

  • add()- Вставляє вказаний елемент до пов'язаної черги блокування. Він видає виняток, якщо черга заповнена.
  • offer()- Вставляє вказаний елемент до пов'язаної черги блокування. Повертається, falseякщо черга заповнена.

Наприклад,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Вихідні дані

 LinkedBlockingQueue: (собака, кішка, кінь) 

Елементи доступу

  • peek()- Повертає елемент з передньої частини пов'язаної черги блокування. Повертається, nullякщо черга порожня.
  • iterator()- Повертає об'єкт-ітератор для послідовного доступу до елемента з пов'язаної черги блокування. Він видає виняток, якщо черга порожня. Ми повинні імпортувати java.util.Iteratorпакет, щоб використовувати його.

Наприклад,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Вихідні дані

 LinkedBlockingQueue: (Dog, Cat, Horse) Елемент доступу: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse, 

Видалити елементи

  • remove()- Повертає та видаляє вказаний елемент із пов'язаної черги блокування. Він видає виняток, якщо черга порожня.
  • poll()- Повертає та видаляє вказаний елемент із пов'язаної черги блокування. Повертається, nullякщо черга порожня.
  • clear() - Видаляє всі елементи із пов'язаної черги блокування.

Наприклад,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated LinkedBlockingQueue " + animals); ) ) 

Вихідні дані

 LinkedBlockingQueue: (Собака, Кіт, Кінь) Видалені елементи: Використання видалення (): Собака за допомогою опитування (): Кішка оновлена ​​LinkedBlockingQueue: () 

put () та take () Методи

У багатопотокових процесах ми можемо використовувати put()і take()для блокування роботи одного потоку, щоб синхронізувати його з іншим потоком. Ці методи будуть чекати, поки їх можна буде успішно виконати.

put () Метод

Щоб вставити вказаний елемент у кінець пов'язаної черги блокування, ми використовуємо put()метод.

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

Наприклад,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Вихідні дані

 LinkedBlockingQueue: (собака, кішка) 

Тут put()метод може кинути, InterruptedExceptionякщо він перерваний під час очікування. Отже, ми повинні вкласти його всередину блоку try… catch.

метод take ()

Для повернення та видалення елемента з передньої частини пов'язаної черги блокування ми можемо скористатися take()методом.

Якщо пов'язана блокувальна черга порожня, вона чекає, поки в пов'язаній блокувальній черзі будуть елементи, які потрібно видалити.

Наприклад,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Вихідні дані

 LinkedBlockingQueue: (Dog, Cat) Видалений елемент: Dog New LinkedBlockingQueue: (Cat) 

Тут take()метод видасть, InterrupedExceptionякщо він перерваний під час очікування. Отже, ми повинні вкласти його всередину try… catchблоку.

Інші методи

Методи Описи
contains(element) Шукає зв’язану чергу блокування для вказаного елемента. Якщо елемент знайдено, він повертається true, якщо ні - повертається false.
size() Повертає довжину пов'язаної черги блокування.
toArray() Перетворює пов'язану чергу блокування в масив і повертає масив.
toString() Перетворює пов'язану чергу блокування в рядок

Навіщо використовувати LinkedBlockingQueue?

В LinkedBlockingQueueвикористовує пов'язані списки в якості внутрішньої пам'яті.

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

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

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

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