În acest tutorial, vom afla despre clasa LinkedBLockingQueue și metodele sale cu ajutorul exemplelor.
LinkedBlockingQueue
Clasa Java Collections
cadru prevede punerea în aplicare coadă de blocare cu ajutorul unei liste legate.
Implementează interfața Java BlockingQueue.
Crearea LinkedBlockingQueue
Pentru a crea o coadă de blocare legată, trebuie să importăm java.util.concurrent.LinkedBlockingQueue
pachetul.
Iată cum putem crea o coadă de blocare legată în Java:
1. Fără capacitatea inițială
LinkedBlockingQueue animal = new LinkedBlockingQueue();
Aici capacitatea inițială implicită va fi 2 31 -1.
2. Cu capacitatea inițială
LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity);
Aici,
- Tip - tipul cozii de blocare conectate
- capacitate - dimensiunea cozii de blocare conectate
De exemplu,
// Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5);
Notă: Nu este obligatoriu să furnizați dimensiunea listei conectate.
Metode de LinkedBlockingQueue
LinkedBlockingQueue
Clasa asigură punerea în aplicare a tuturor metodelor din interfața BlockingQueue.
Aceste metode sunt utilizate pentru a insera, accesa și șterge elemente din cozile de blocare conectate.
De asemenea, vom afla despre două metode put()
și take()
care acceptă operația de blocare în coada de blocare legată.
Aceste două metode disting coada de blocare legată de alte cozi tipice.
Inserați elemente
add()
- Inserează un element specificat în coada de blocare legată. Aruncă o excepție dacă coada este plină.offer()
- Inserează un element specificat în coada de blocare legată. Revinefalse
dacă coada este plină.
De exemplu,
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); ) )
Ieșire
LinkedBlockingQueue: (câine, pisică, cal)
Elemente de acces
peek()
- Returnează un element din partea din față a cozii de blocare conectate. Revinenull
dacă coada este goală.iterator()
- Returnează un obiect iterator pentru a accesa secvențial un element din coada de blocare legată. Aruncă o excepție dacă coada este goală. Trebuie să importămjava.util.Iterator
pachetul pentru al utiliza.
De exemplu,
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(", "); ) ) )
Ieșire
LinkedBlockingQueue: (câine, pisică, cal) Element accesat: Dog LinkedBlockingQueue Elemente: câine, pisică, cal,
Eliminați elementele
remove()
- Returnează și elimină un element specificat din coada de blocare legată. Aruncă o excepție dacă coada este goală.poll()
- Returnează și elimină un element specificat din coada de blocare legată. Revinenull
dacă coada este goală.clear()
- Elimină toate elementele din coada de blocare legată.
De exemplu,
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); ) )
Ieșire
LinkedBlockingQueue: (câine, pisică, cal) Elemente eliminate: folosind remove (): câine folosind sondaj (): Cat actualizat LinkedBlockingQueue: ()
metode put () și take ()
În procesele multithreading, putem utiliza put()
și take()
bloca funcționarea unui fir pentru a-l sincroniza cu alt thread. Aceste metode vor aștepta până când vor putea fi executate cu succes.
put () Metoda
Pentru a insera elementul specificat la sfârșitul unei cozi de blocare conectate, folosim put()
metoda.
Dacă coada de blocare legată este plină, așteaptă până când există spațiu în coada de blocare legată pentru a insera elementul.
De exemplu,
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); ) ) )
Ieșire
LinkedBlockingQueue: (câine, pisică)
Aici, put()
metoda poate arunca o InterruptedException
dacă este întreruptă în timp ce așteptați. Prin urmare, trebuie să îl închidem într-un bloc de încercare … captură.
take () Metodă
Pentru a returna și a elimina un element din partea din față a cozii de blocare conectate, putem folosi take()
metoda.
Dacă coada de blocare legată este goală, așteaptă până când vor fi șterse elemente în coada de blocare legată.
De exemplu,
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); ) ) )
Ieșire
LinkedBlockingQueue: (câine, pisică) Element eliminat: câine Nou LinkedBlockingQueue: (pisică)
Aici, take()
metoda va arunca un InterrupedException
dacă este întrerupt în timp ce așteptați. Prin urmare, trebuie să îl închidem într-un try… catch
bloc.
Alte metode
Metode | Descrieri |
---|---|
contains(element) | Căutează coada de blocare legată pentru elementul specificat. Dacă elementul este găsit, se întoarce true , dacă nu, se întoarce false . |
size() | Returnează lungimea cozii de blocare conectate. |
toArray() | Convertește coada de blocare legată într-o matrice și returnează matricea. |
toString() | Convertește coada de blocare legată în șir |
De ce să folosiți LinkedBlockingQueue?
În LinkedBlockingQueue
utilizările legate liste de stocare internă.
Este considerată o colecție sigură pentru fire . Prin urmare, este utilizat în general în aplicații multi-threading.
Să presupunem că un fir introduce elemente în coadă și un alt fir elimină elemente din coadă.
Acum, dacă primul fir este mai lent decât al doilea fir, atunci coada de blocare legată poate face ca al doilea fir să aștepte până când primul fir își finalizează operațiunile.