Java LinkedBlockingQueue

U ovom uputstvu uz primjere ćemo naučiti o klasi LinkedBLockingQueue i njezinim metodama.

LinkedBlockingQueueKlasa Java Collectionsokvira pruža blokira provođenje reda pomoću vezana lista.

Provodi sučelje Java BlockingQueue.

Stvaranje LinkedBlockingQueue

Da bismo stvorili povezani red za blokiranje, moramo uvesti java.util.concurrent.LinkedBlockingQueuepaket.

Evo kako možemo stvoriti povezani blokirni red u Javi:

1. Bez početnog kapaciteta

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Ovdje će zadani početni kapacitet biti 2 31 -1.

2. S početnim kapacitetom

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Ovdje,

  • Vrsta - vrsta povezanog reda za blokiranje
  • kapacitet - veličina povezanog reda za blokiranje

Na primjer,

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

Napomena: Nije obvezno navesti veličinu povezanog popisa.

Metode LinkedBlockingQueue

LinkedBlockingQueueKlasa osigurava provedbu svih metoda u BlockingQueue sučelja.

Ove se metode koriste za umetanje, pristup i brisanje elemenata iz povezanih redova za blokiranje.

Također, naučit ćemo o dvije metode put()i take()koje podržavaju operaciju blokiranja u povezanom redu za blokiranje.

Ove dvije metode razlikuju povezani blokirni red od ostalih tipičnih redova.

Umetni elemente

  • add()- Ubacuje navedeni element u povezani red za blokiranje. Dobavlja iznimku ako je red pun.
  • offer()- Ubacuje navedeni element u povezani red za blokiranje. Vraća se falseako je red pun.

Na primjer,

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

Izlaz

 LinkedBlockingQueue: (pas, mačka, konj) 

Pristup elementima

  • peek()- Vraća element s prednje strane povezanog reda za blokiranje. Vraća se nullako je red prazan.
  • iterator()- Vraća objekt iteratora za sekvencijalni pristup elementu iz povezanog reda za blokiranje. Dobavlja iznimku ako je red prazan. Moramo uvesti java.util.Iteratorpaket da bismo ga koristili.

Na primjer,

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

Izlaz

 LinkedBlockingQueue: (pas, mačka, konj) Pristupljeni element: pas LinkedBlockingQueue elementi: pas, mačka, konj, 

Uklonite elemente

  • remove()- Vraća i uklanja navedeni element iz povezanog reda za blokiranje. Dobavlja iznimku ako je red prazan.
  • poll()- Vraća i uklanja navedeni element iz povezanog reda za blokiranje. Vraća se nullako je red prazan.
  • clear() - Uklanja sve elemente iz povezanog reda za blokiranje.

Na primjer,

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

Izlaz

 LinkedBlockingQueue: (Pas, Mačka, Konj) Uklonjeni elementi: Korištenje remove (): Pas Korištenje ankete (): Mačka Ažurirano LinkedBlockingQueue: () 

put () i take () metode

U postupcima s više niti možemo koristiti put()i take()za blokiranje rada jedne niti da bismo je sinkronizirali s drugom niti. Ove će metode pričekati dok se ne mogu uspješno izvršiti.

put () Metoda

Da bismo umetnuli navedeni element na kraj povezanog reda za blokiranje, koristimo put()metodu.

Ako je povezani red za blokiranje pun, čeka se dok u povezanom redu za blokiranje nema mjesta za umetanje elementa.

Na primjer,

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

Izlaz

 LinkedBlockingQueue: (pas, mačka) 

Ovdje put()metoda može baciti InterruptedExceptionako se prekine dok se čeka. Stoga ga moramo priložiti unutar bloka try… catch.

take () metoda

Da bismo vratili i uklonili element s prednje strane povezanog reda za blokiranje, možemo koristiti take()metodu.

Ako je povezani red za blokiranje prazan, čeka dok se elementi iz povezanog blokirnog reda ne izbrišu.

Na primjer,

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

Izlaz

 LinkedBlockingQueue: (Pas, Mačka) Uklonjeni element: Pas Novo LinkedBlockingQueue: (Mačka) 

Ovdje će take()metoda baciti znak InterrupedExceptionif ako je prekinut dok se čeka. Stoga ga moramo zatvoriti u try… catchblok.

Ostale metode

Metode Opisi
contains(element) Pretražuje povezani blokirni red za navedeni element. Ako je element pronađen, on se vraća true, ako nije, vraća se false.
size() Vraća duljinu povezanog reda za blokiranje.
toArray() Pretvara povezani red za blokiranje u niz i vraća niz.
toString() Pretvara povezani red za blokiranje u niz

Zašto koristiti LinkedBlockingQueue?

Na LinkedBlockingQueuekoristi povezane liste kao svoju internu pohranu.

Smatra se kolekcijom sigurnom u nitima . Stoga se obično koristi u aplikacijama s više niti.

Pretpostavimo da jedna nit ubacuje elemente u red, a druga nit uklanja elemente iz reda.

Sada, ako je prva nit sporija od druge niti, tada povezani blokirajući red može natjerati drugu nit da čeka dok prva nit ne dovrši svoje operacije.

Zanimljivi članci...