Ebben az oktatóanyagban példák segítségével megismerhetjük a LinkedBLockingQueue osztályt és annak módszereit.
A LinkedBlockingQueue
Java Collections
keretrendszer osztálya biztosítja a blokkolási sor megvalósítását összekapcsolt lista segítségével.
Megvalósítja a Java BlockingQueue felületet.
LinkedBlockingQueue létrehozása
Összekapcsolt blokkolási sor létrehozásához importálnunk kell a java.util.concurrent.LinkedBlockingQueue
csomagot.
Így hozhatunk létre összekapcsolt blokkoló sort a Java-ban:
1. A kezdeti kapacitás nélkül
LinkedBlockingQueue animal = new LinkedBlockingQueue();
Itt az alapértelmezett kezdeti kapacitás 2 31 -1 lesz.
2. A kezdeti kapacitással
LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity);
Itt,
- Típus - a kapcsolt blokkoló sor típusa
- kapacitás - a kapcsolt blokkoló sor mérete
Például,
// Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5);
Megjegyzés: Nem kötelező megadni a linkelt lista méretét.
A LinkedBlockingQueue módszerei
Az LinkedBlockingQueue
osztály biztosítja az összes módszer megvalósítását a BlockingQueue felületen.
Ezeket a módszereket használják az összekapcsolt blokkoló sorokból elemek beillesztésére, elérésére és törlésére.
Ezenkívül megismerünk két módszert put()
, take()
amelyek támogatják a blokkolási műveletet a kapcsolt blokkolási sorban.
Ez a két módszer megkülönbözteti a kapcsolt blokkoló várólistát a többi tipikus várólistától.
Helyezze be az elemeket
add()
- Beilleszt egy megadott elemet a kapcsolt blokkoló sorba. Kivételt vet, ha a sor tele van.offer()
- Beilleszt egy megadott elemet a kapcsolt blokkoló sorba. Akkor tér vissza,false
ha a sor tele van.
Például,
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); ) )
Kimenet
LinkedBlockingQueue: (Kutya, Macska, Ló)
Hozzáférési elemek
peek()
- Visszaad egy elemet a kapcsolt blokkoló sor elejéről. Akkor tér vissza,null
ha a sor üres.iterator()
- Visszaad egy iterátorobjektumot, amely az összekapcsolt blokkoló várakozási sorból egymás után eléri az elemeket. Kivételt dob, ha a sor üres. A használatához be kell importálnunk ajava.util.Iterator
csomagot.
Például,
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(", "); ) ) )
Kimenet
LinkedBlockingQueue: (Kutya, Macska, Ló) Hozzáférhető elem: Kutya LinkedBlockingQueue Elemek: Kutya, Macska, Ló,
Elemek eltávolítása
remove()
- Visszaad és eltávolít egy megadott elemet a kapcsolt blokkoló sorból. Kivételt dob, ha a sor üres.poll()
- Visszaad és eltávolít egy megadott elemet a kapcsolt blokkoló sorból. Akkor tér vissza,null
ha a sor üres.clear()
- Eltávolítja az összes elemet a kapcsolt blokkolási sorból.
Például,
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); ) )
Kimenet
LinkedBlockingQueue: (Kutya, Macska, Ló) Eltávolított elemek: Eltávolítás () használata: Kutya közvélemény-kutatást használ (): Macska frissítve LinkedBlockingQueue: ()
put () és take () metódusok
A többszálas folyamatok, tudjuk használni put()
, és take()
blokkolja a működését egy szál szinkronizálni másik téma. Ezek a módszerek megvárják, amíg sikeresen végrehajtják őket.
put () módszer
A megadott elemet egy összekapcsolt blokkoló sor végére illesztjük, a put()
módszert használjuk .
Ha az összekapcsolt blokkolási sor megtelt, akkor megvárja, amíg az összekapcsolt blokkoló sorban van hely az elem beszúrására.
Például,
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); ) ) )
Kimenet
LinkedBlockingQueue: (Kutya, Macska)
Itt a put()
módszer dobhat egy, InterruptedException
ha várakozás közben megszakad. Ezért be kell csatolnunk egy próba … elkapó blokkba.
take () módszer
Egy elem visszaküldéséhez és eltávolításához a kapcsolt blokkoló sor elejéről használhatjuk a take()
módszert.
Ha a kapcsolt blokkoló sor üres, akkor megvárja, amíg a kapcsolt blokkoló sorban vannak elemek, amelyeket törölni kell.
Például,
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); ) ) )
Kimenet
LinkedBlockingQueue: (Kutya, Macska) Eltávolított Elem: Kutya Új LinkedBlockingQueue: (Macska)
Itt a take()
módszer dob, InterrupedException
ha várakozás közben megszakad. Ezért be kell zárnunk egy try… catch
blokkba.
Egyéb módszerek
Mód | Leírások |
---|---|
contains(element) | Megkeresi a hivatkozott blokkoló várólistát a megadott elemre. Ha az elem megtalálható, akkor visszatér true , ha nem, akkor visszatér false . |
size() | Visszaadja a kapcsolt blokkolási sor hosszát. |
toArray() | A kapcsolt blokkoló várólistát tömbgé alakítja, és visszaadja a tömböt. |
toString() | A kapcsolt blokkoló várólistát karakterlánnyá alakítja |
Miért érdemes használni a LinkedBlockingQueue programot?
Az LinkedBlockingQueue
összekapcsolt listákat használja belső tárhelyként.
Menetbiztos gyűjteménynek számít . Ezért általában többszálas alkalmazásokban használják.
Tegyük fel, hogy az egyik szál elemeket illeszt be a sorba, egy másik szál pedig eltávolítja az elemeket a sorból.
Ha az első szál lassabb, mint a második szál, akkor az összekapcsolt blokkoló várakozási sor arra késztetheti a második szálat, amíg az első szál befejezi a műveletét.