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