I denne vejledning lærer vi om Java BlockingQueue-grænsefladen og dens metoder.
Den BlockingQueue
grænsefladen af Java Collections
rammer udvider Queue
grænsefladen. Det tillader enhver operation at vente, indtil den kan udføres med succes.
For eksempel, hvis vi vil slette et element fra en tom kø, så tillader den blokerende kø, at sletningen kan vente, indtil køen indeholder nogle elementer, der skal slettes.
Klasser, der implementerer BlockingQueue
Da det BlockingQueue
er en grænseflade, kan vi ikke levere den direkte implementering af det.
For at kunne bruge funktionaliteten i BlockingQueue
, skal vi bruge klasser, der implementerer den.
- ArrayBlockingQueue
- LinkedBlockingQueue
Hvordan bruges blokerende køer?
Vi skal importere java.util.concurrent.BlockingQueue
pakken for at kunne bruge den BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Her har vi oprettet objekter animal1 og animal2 af henholdsvis klasser ArrayBlockingQueue
og LinkedBlockingQueue
. Disse objekter kan bruge funktionerne i BlockingQueue
grænsefladen.
Metoder til BlockingQueue
Baseret på om en kø er fuld eller tom, kan metoder til en blokeringskø opdeles i 3 kategorier:
Metoder, der kaster en undtagelse
add()
- Indsætter et element i den blokerende kø i slutningen af køen. Kaster en undtagelse, hvis køen er fuld.element()
- Returnerer hovedet på den blokerende kø. Kaster en undtagelse, hvis køen er tom.remove()
- Fjerner et element fra den blokerende kø. Kaster en undtagelse, hvis køen er tom.
Metoder, der returnerer en vis værdi
offer()
- Indsætter det angivne element i den blokerende kø i slutningen af køen. Returnerer,false
hvis køen er fuld.peek()
- Returnerer hovedet på den blokerende kø. Returnerer,null
hvis køen er tom.poll()
- Fjerner et element fra den blokerende kø. Returnerer,null
hvis køen er tom.
Mere på tilbud () og afstemning ()
Metoden offer()
og poll()
kan bruges med timeouts. Det vil sige, vi kan overføre tidsenheder som en parameter. For eksempel,
offer(value, 100, milliseconds)
Her,
- værdi er det element, der skal indsættes i køen
- Og vi har indstillet en timeout på 100 millisekunder
Dette betyder, at offer()
metoden vil forsøge at indsætte et element i den blokerende kø i 100
millisekunder. Hvis elementet ikke kan indsættes i 100 millisekunder, returneres metoden false
.
Bemærk: I stedet for milliseconds
, vi kan også bruge disse tidsenheder: days
, hours
, minutes
, seconds
, microseconds
og nanoseconds
i offer()
og poll()
metoder.
Metoder, der blokerer for operationen
Dette BlockingQueue
giver også metoder til at blokere operationerne og vente, hvis køen er fuld eller tom.
put()
- Indsætter et element i den blokerende kø. Hvis køen er fuld, venter den, indtil køen har plads til at indsætte et element.take()
- Fjerner og returnerer et element fra den blokerende kø. Hvis køen er tom, venter den, indtil køen har elementer, der skal slettes.
Antag, vi vil indsætte elementer i en kø. Hvis køen er fuld put()
, venter metoden, indtil køen har plads til at indsætte elementer.
Tilsvarende, hvis vi vil slette elementer fra en kø. Hvis køen er tom take()
, venter metoden, indtil køen indeholder elementer, der skal slettes.
Implementering af BlockingQueue i ArrayBlockingQueue
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Produktion
BlockingQueue: (2, 1, 3) Fjernet element: 2
For at lære mere om det ArrayBlockingQueue
, besøg Java ArrayBlockingQueue.
Hvorfor BlockingQueue?
I Java BlockingQueue
betragtes det som den trådsikre samling. Det er fordi det kan være nyttigt i multi-threading-operationer.
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 kører langsommere, kan den blokerende kø få den anden tråd til at vente, indtil den første tråd er færdig med operationen.