Šajā apmācībā mēs ar piemēru palīdzību uzzināsim par LinkedBLockingQueue klasi un tās metodēm.
LinkedBlockingQueue
Java klases Collections
ietvaros nodrošina bloķēšanu rindu ieviešanu, izmantojot saistītu sarakstu.
Tas ievieš Java BlockingQueue saskarni.
LinkedBlockingQueue izveide
Lai izveidotu saistītu bloķēšanas rindu, mums ir jāimportē java.util.concurrent.LinkedBlockingQueue
pakotne.
Lūk, kā mēs varam izveidot saistītu bloķēšanas rindu Java:
1. Bez sākotnējās jaudas
LinkedBlockingQueue animal = new LinkedBlockingQueue();
Šeit noklusējuma sākotnējā jauda būs 2 31 -1.
2. Ar sākotnējo jaudu
LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity);
Šeit,
- Tips - saistītās bloķēšanas rindas veids
- kapacitāte - saistītās bloķēšanas rindas lielums
Piemēram,
// Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5);
Piezīme. Saistītā saraksta lielums nav obligāti jānorāda.
LinkedBlockingQueue metodes
LinkedBlockingQueue
Klase paredz nodrošināt visu metožu BlockingQueue interfeisu.
Šīs metodes tiek izmantotas, lai ievietotu, piekļūtu un dzēstu elementus no saistītajām bloķēšanas rindām.
Arī mēs uzzināt par divām metodēm put()
un take()
kas atbalsta bloķēšanas darbību saistītajā bloķēšanas rindā.
Šīs divas metodes atšķir saistīto bloķēšanas rindu no citām tipiskām rindām.
Ievietot elementus
add()
- ievieto norādīto elementu saistītajā bloķēšanas rindā. Tas rada izņēmumu, ja rinda ir pilna.offer()
- ievieto norādīto elementu saistītajā bloķēšanas rindā. Tas atgriežas,false
ja rinda ir pilna.
Piemēram,
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); ) )
Rezultāts
LinkedBlockingQueue: (suns, kaķis, zirgs)
Piekļuves elementi
peek()
- atgriež elementu no saistītās bloķēšanas rindas priekšpuses. Tas atgriežas,null
ja rinda ir tukša.iterator()
- atgriež iteratora objektu, lai secīgi piekļūtu elementam no saistītās bloķēšanas rindas. Tas rada izņēmumu, ja rinda ir tukša. Mums ir jāimportējava.util.Iterator
pakete, lai to izmantotu.
Piemēram,
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(", "); ) ) )
Rezultāts
LinkedBlockingQueue: (suns, kaķis, zirgs) pieejamais elements: suns LinkedBlockingQueue elementi: suns, kaķis, zirgs,
Noņemt elementus
remove()
- atgriež un noņem noteiktu elementu no saistītās bloķēšanas rindas. Tas rada izņēmumu, ja rinda ir tukša.poll()
- atgriež un noņem noteiktu elementu no saistītās bloķēšanas rindas. Tas atgriežas,null
ja rinda ir tukša.clear()
- Noņem visus elementus no saistītās bloķēšanas rindas.
Piemēram,
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); ) )
Rezultāts
LinkedBlockingQueue: (suns, kaķis, zirgs) Noņemtie elementi: Izmantojot remove (): suns izmanto aptauju (): Cat atjaunināja LinkedBlockingQueue: ()
put () un take () metodes
Daudzlīniju procesos mēs varam izmantot put()
un take()
bloķēt viena pavediena darbību, lai sinhronizētu to ar citu pavedienu. Šīs metodes gaidīs, līdz tās varēs veiksmīgi izpildīt.
put () metode
Lai ievietotu norādīto elementu saistītās bloķēšanas rindas beigās, mēs izmantojam put()
metodi.
Ja saistītā bloķēšanas rinda ir pilna, tā gaida, līdz saistītajā bloķēšanas rindā ir vieta elementa ievietošanai.
Piemēram,
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); ) ) )
Rezultāts
LinkedBlockingQueue: (suns, kaķis)
Šeit put()
metode var mest, InterruptedException
ja tā tiek pārtraukta gaidīšanas laikā. Tādējādi mums tas jāpievieno izmēģinājuma … ķeršanas blokam.
ņemt () metode
Lai atgrieztu un noņemtu elementu no saistītās bloķēšanas rindas priekšpuses, mēs varam izmantot take()
metodi.
Ja saistītā bloķēšanas rinda ir tukša, tā gaida, līdz saistītās bloķēšanas rindā ir dzēsti elementi.
Piemēram,
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); ) ) )
Rezultāts
LinkedBlockingQueue: (suns, kaķis) noņemtais elements: suns jauns LinkedBlockingQueue: (kaķis)
Šeit take()
metode izmet, InterrupedException
ja tā tiek pārtraukta gaidīšanas laikā. Tādējādi mums tas jāievieto try… catch
bloka iekšpusē .
Citas metodes
Metodes | Apraksti |
---|---|
contains(element) | Meklē norādītā elementa saistīto bloķēšanas rindu. Ja elements ir atrasts, tas atgriežas true , ja nē, tas atgriežas false . |
size() | Atgriež saistītās bloķēšanas rindas garumu. |
toArray() | Pārvērš saistīto bloķēšanas rindu masīvā un atgriež masīvu. |
toString() | Pārvērš saistīto bloķēšanas rindu par virkni |
Kāpēc izmantot LinkedBlockingQueue?
Par LinkedBlockingQueue
izmanto saistīti saraksti, jo tās iekšējās atmiņas.
To uzskata par vītnei drošu kolekciju. Tādējādi to parasti izmanto vairāku vītņu lietojumprogrammās.
Pieņemsim, ka viens pavediens ievieto elementus rindā, bet cits pavediens noņem elementus no rindas.
Tagad, ja pirmais pavediens ir lēnāks nekā otrais pavediens, saistītā bloķēšanas rinda var likt otrajam pavedienam gaidīt, kamēr pirmais pavediens pabeidz savas darbības.