U ovom uputstvu uz primjere ćemo naučiti o klasi LinkedBLockingQueue i njezinim metodama.
LinkedBlockingQueue
Klasa Java Collections
okvira 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.LinkedBlockingQueue
paket.
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
LinkedBlockingQueue
Klasa 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 sefalse
ako 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 senull
ako je red prazan.iterator()
- Vraća objekt iteratora za sekvencijalni pristup elementu iz povezanog reda za blokiranje. Dobavlja iznimku ako je red prazan. Moramo uvestijava.util.Iterator
paket 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 senull
ako 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 InterruptedException
ako 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 InterrupedException
if ako je prekinut dok se čeka. Stoga ga moramo zatvoriti u try… catch
blok.
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 LinkedBlockingQueue
koristi 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.