Java LinkedBlockingQueue

V tomto kurzu se pomocí příkladů dozvíme o třídě LinkedBLockingQueue a jejích metodách.

LinkedBlockingQueueTřída Java Collectionsrámce zajišťuje realizaci blokování fronty pomocí propojeného seznamu.

Implementuje rozhraní Java BlockingQueue.

Vytváření LinkedBlockingQueue

Abychom mohli vytvořit propojenou blokující frontu, musíme java.util.concurrent.LinkedBlockingQueuebalíček importovat .

Takto můžeme vytvořit propojenou blokující frontu v Javě:

1. Bez počáteční kapacity

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Zde bude výchozí počáteční kapacita 2 31 -1.

2. S počáteční kapacitou

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Tady,

  • Typ - typ propojené blokující fronty
  • kapacita - velikost propojené blokující fronty

Například,

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

Poznámka: Není nutné uvádět velikost propojeného seznamu.

Metody LinkedBlockingQueue

LinkedBlockingQueueTřída poskytuje realizaci všech metod v rozhraní BlockingQueue.

Tyto metody se používají k vkládání, přístupu a mazání prvků z propojených blokujících front.

Také se dozvíme o dvou metod put()a take()této podpory blokování provozu v propojené blokování fronty.

Tyto dvě metody rozlišují propojenou blokující frontu od jiných typických front.

Vložit prvky

  • add()- Vloží určený prvek do propojené fronty blokování. Pokud je fronta plná, vyvolá výjimku.
  • offer()- Vloží určený prvek do propojené fronty blokování. Vrátí se, falsepokud je fronta plná.

Například,

 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); ) ) 

Výstup

 LinkedBlockingQueue: (pes, kočka, kůň) 

Přístupové prvky

  • peek()- Vrátí prvek z přední části propojené blokující fronty. Vrátí se, nullpokud je fronta prázdná.
  • iterator()- Vrací objekt iterátoru, aby postupně získal přístup k prvku z propojené blokující fronty. Pokud je fronta prázdná, vyvolá výjimku. Abychom mohli java.util.Iteratorbalíček použít, musíme jej importovat .

Například,

 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(", "); ) ) ) 

Výstup

 LinkedBlockingQueue: (pes, kočka, kůň) Přistupovaný prvek: pes Prvky LinkedBlockingQueue: pes, kočka, kůň, 

Odebrat prvky

  • remove() - Returns and removes a specified element from the linked blocking queue. It throws an exception if the queue is empty.
  • poll() - Returns and removes a specified element from the linked blocking queue. It returns null if the queue is empty.
  • clear() - Removes all the elements from the linked blocking queue.

For example,

 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); ) ) 

Output

 LinkedBlockingQueue: (Dog, Cat, Horse) Removed Elements: Using remove(): Dog Using poll(): Cat Updated LinkedBlockingQueue: () 

put() and take() Methods

In multithreading processes, we can use put() and take() to block the operation of one thread to synchronize it with another thread. These methods will wait until they can be successfully executed.

put() Method

To insert the specified element to the end of a linked blocking queue, we use the put() method.

If the linked blocking queue is full, it waits until there is space in the linked blocking queue to insert the element.

For example,

 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); ) ) ) 

Output

 LinkedBlockingQueue: (Dog, Cat) 

Here, the put() method may throw an InterruptedException if it is interrupted while waiting. Hence, we must enclose it inside a try… catch block.

take() Method

To return and remove an element from the front of the linked blocking queue, we can use the take() method.

If the linked blocking queue is empty, it waits until there are elements in the linked blocking queue to be deleted.

For example,

 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); ) ) ) 

Output

 LinkedBlockingQueue: (Dog, Cat) Removed Element: Dog New LinkedBlockingQueue: (Cat) 

Here, the take() method will throw an InterrupedException if it is interrupted while waiting. Hence, we must enclose it inside a try… catch block.

Other Methods

Methods Descriptions
contains(element) Hledá propojenou frontu blokování pro zadaný prvek. Pokud je prvek nalezen, vrátí se true, pokud ne, vrátí se false.
size() Vrátí délku propojené blokující fronty.
toArray() Převede propojenou blokující frontu na pole a vrátí pole.
toString() Převede propojenou blokující frontu na řetězec

Proč používat LinkedBlockingQueue?

K LinkedBlockingQueuepoužití souvisí seznamy jako jeho vnitřní paměti.

Je považována za kolekci bezpečnou pro vlákna . Proto se obecně používá v aplikacích s více podprocesy.

Předpokládejme, že jedno vlákno vkládá prvky do fronty a jiné vlákno odebírá prvky z fronty.

Nyní, pokud je první vlákno pomalejší než druhé vlákno, může propojená fronta blokování způsobit, že druhé vlákno čeká, dokud první vlákno nedokončí své operace.

Zajímavé články...