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: (Куче, котка, кон) Достъпен елемент: Куче LinkedBlockingQueue елементи: куче, котка, кон, 

Премахване на елементи

  • 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ако е прекъснат, докато чакате. Следователно трябва да го приложим в блок за опити … улов.

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употребите свързани списъци нейната вътрешна памет.

Счита се за безопасно събиране на конци . Следователно, той обикновено се използва в многопоточни приложения.

Да предположим, че една нишка вмъква елементи в опашката, а друга нишка премахва елементи от опашката.

Сега, ако първата нишка е по-бавна от втората нишка, тогава свързаната блокираща опашка може да накара втората нишка да чака, докато първата нишка завърши своите операции.

Интересни статии...