I denne vejledning lærer vi om LinkedBLockingQueue-klassen og dens metoder ved hjælp af eksempler.
Den LinkedBlockingQueue
klasse af Java Collections
rammer giver det blokerende kø implementering ved hjælp af en sammenkædet liste.
Det implementerer Java BlockingQueue-grænsefladen.
Oprettelse af LinkedBlockingQueue
For at oprette en sammenkædet blokeringskø skal vi importere java.util.concurrent.LinkedBlockingQueue
pakken.
Her er hvordan vi kan oprette en sammenkædet blokeringskø i Java:
1. Uden den oprindelige kapacitet
LinkedBlockingQueue animal = new LinkedBlockingQueue();
Her er standard startkapacitet 2 31 -1.
2. Med den oprindelige kapacitet
LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity);
Her,
- Type - typen af den sammenkædede blokeringskø
- kapacitet - størrelsen på den sammenkædede blokerende kø
For eksempel,
// Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5);
Bemærk: Det er ikke obligatorisk at angive størrelsen på den linkede liste.
Metoder til LinkedBlockingQueue
Den LinkedBlockingQueue
klasse giver gennemførelsen af alle de metoder i BlockingQueue interfacet.
Disse metoder bruges til at indsætte, få adgang til og slette elementer fra sammenkædede blokeringskøer.
Vi lærer også om to metoder, put()
og take()
som understøtter blokeringsoperationen i den sammenkædede blokerings kø.
Disse to metoder skelner den sammenkædede blokerende kø fra andre typiske køer.
Indsæt elementer
add()
- Indsætter et specificeret element i den sammenkædede blokeringskø. Det giver en undtagelse, hvis køen er fuld.offer()
- Indsætter et specificeret element i den sammenkædede blokeringskø. Den vender tilbage,false
hvis køen er fuld.
For eksempel,
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); ) )
Produktion
LinkedBlockingQueue: (Hund, kat, hest)
Adgangselementer
peek()
- Returnerer et element fra forsiden af den sammenkædede blokeringskø. Den vender tilbage,null
hvis køen er tom.iterator()
- Returnerer et iteratorobjekt for sekventielt at få adgang til et element fra den sammenkædede blokerende kø. Det giver en undtagelse, hvis køen er tom. Vi skal importerejava.util.Iterator
pakken for at bruge den.
For eksempel,
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(", "); ) ) )
Produktion
LinkedBlockingQueue: (Dog, Cat, Horse) Accessed Element: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse,
Fjern elementer
remove()
- Returnerer og fjerner et bestemt element fra den sammenkædede blokeringskø. Det giver en undtagelse, hvis køen er tom.poll()
- Returnerer og fjerner et bestemt element fra den sammenkædede blokeringskø. Den vender tilbage,null
hvis køen er tom.clear()
- Fjerner alle elementerne fra den sammenkædede blokeringskø.
For eksempel,
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); ) )
Produktion
LinkedBlockingQueue: (Hund, kat, hest) Fjernede elementer: Brug af remove (): Hund ved hjælp af afstemning (): Cat Opdateret LinkedBlockingQueue: ()
sæt () og tag () Metoder
I multitrådningsprocesser kan vi bruge put()
og take()
blokere driften af en tråd til at synkronisere den med en anden tråd. Disse metoder venter, indtil de kan udføres med succes.
put () Metode
For at indsætte det angivne element i slutningen af en sammenkædet blokeringskø bruger vi put()
metoden.
Hvis den sammenkædede blokerende kø er fuld, venter den, indtil der er plads i den sammenkædede blokerende kø til at indsætte elementet.
For eksempel,
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); ) ) )
Produktion
LinkedBlockingQueue: (Hund, kat)
Her kan put()
metoden smide en, InterruptedException
hvis den afbrydes, mens du venter. Derfor skal vi vedlægge den i en prøve … fangstblok.
tage () metode
For at returnere og fjerne et element fra forsiden af den sammenkædede blokeringskø, kan vi bruge take()
metoden.
Hvis den sammenkædede blokerende kø er tom, venter den, indtil der er elementer i den sammenkædede blokerende kø, der skal slettes.
For eksempel,
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); ) ) )
Produktion
LinkedBlockingQueue: (Dog, Cat) Fjernet element: Dog New LinkedBlockingQueue: (Cat)
Her take()
kaster metoden en, InterrupedException
hvis den afbrydes, mens du venter. Derfor skal vi lægge den inde i en try… catch
blok.
Andre metoder
Metoder | Beskrivelser |
---|---|
contains(element) | Søger i den sammenkædede blokeringskø efter det angivne element. Hvis elementet findes, returnerer det true , hvis ikke det returnerer false . |
size() | Returnerer længden på den sammenkædede blokeringskø. |
toArray() | Konverterer sammenkædet blokerende kø til et array og returnerer arrayet. |
toString() | Konverterer den sammenkædede blokerende kø til streng |
Hvorfor bruge LinkedBlockingQueue?
De LinkedBlockingQueue
anvendelser knyttet lister som sin interne lager.
Det betragtes som en trådsikker samling. Derfor bruges det generelt i applikationer med flere tråde.
Antag, at en tråd indsætter elementer i køen, og en anden tråd fjerner elementer fra køen.
Hvis den første tråd nu er langsommere end den anden tråd, så kan den sammenkædede blokerende kø få den anden tråd til at vente, indtil den første tråd gennemfører sine operationer.