I denne opplæringen vil vi lære om Java BlockingQueue-grensesnittet og dets metoder.
Den BlockingQueue
grensesnittet til Java Collections
rammeverk utvider Queue
grensesnittet. Den lar enhver operasjon vente til den kan utføres.
Hvis vi for eksempel vil slette et element fra en tom kø, lar blokkeringskøen sletteoperasjonen vente til køen inneholder noen elementer som skal slettes.
Klasser som implementerer BlockingQueue
Siden BlockingQueue
er et grensesnitt, kan vi ikke gi den direkte implementeringen av det.
For å kunne bruke funksjonaliteten til BlockingQueue
, må vi bruke klasser som implementerer den.
- ArrayBlockingQueue
- LinkedBlockingQueue
Hvordan bruker jeg blokkeringskøer?
Vi må importere java.util.concurrent.BlockingQueue
pakken for å kunne bruke den BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Her har vi laget objekter animal1 og animal2 av klasser ArrayBlockingQueue
og LinkedBlockingQueue
henholdsvis. Disse objektene kan bruke funksjonene til BlockingQueue
grensesnittet.
Metoder for BlockingQueue
Basert på om en kø er full eller tom, kan metoder for blokkeringskø deles inn i 3 kategorier:
Metoder som kaster et unntak
add()
- Setter inn et element i blokkeringskøen på slutten av køen. Kaster et unntak hvis køen er full.element()
- Returnerer hodet til blokkeringskøen. Kaster et unntak hvis køen er tom.remove()
- Fjerner et element fra blokkeringskøen. Kaster et unntak hvis køen er tom.
Metoder som gir noe verdi
offer()
- Setter inn det angitte elementet i blokkeringskøen på slutten av køen. Returnererfalse
hvis køen er full.peek()
- Returnerer hodet til blokkeringskøen. Returnerernull
hvis køen er tom.poll()
- Fjerner et element fra blokkeringskøen. Returnerernull
hvis køen er tom.
Mer på tilbud () og avstemning ()
Den offer()
og poll()
fremgangsmåten kan brukes med tidsavbrudd. Det vil si at vi kan overføre tidsenheter som en parameter. For eksempel,
offer(value, 100, milliseconds)
Her,
- verdi er elementet som skal settes inn i køen
- Og vi har satt en timeout på 100 millisekunder
Dette betyr at offer()
metoden vil prøve å sette inn et element i blokkeringskøen i 100
millisekunder. Hvis elementet ikke kan settes inn på 100 millisekunder, returnerer metoden false
.
Merk: I stedet for milliseconds
, kan vi også bruke disse tidsenheter: days
, hours
, minutes
, seconds
, microseconds
og nanoseconds
i offer()
og poll()
metoder.
Metoder som blokkerer operasjonen
Dette BlockingQueue
gir også metoder for å blokkere operasjonene og vente på at køen er full eller tom.
put()
- Setter inn et element i blokkeringskøen. Hvis køen er full, vil den vente til køen har plass til å sette inn et element.take()
- Fjerner og returnerer et element fra blokkeringskøen. Hvis køen er tom, vil den vente til køen har elementer som skal slettes.
Anta at vi ønsker å sette inn elementer i en kø. Hvis køen er full vil put()
metoden vente til køen har plass til å sette inn elementer.
Tilsvarende hvis vi vil slette elementer fra en kø. Hvis køen er tom, vil take()
metoden vente til køen inneholder elementer som skal slettes.
Implementering av 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(); ) ) )
Produksjon
BlockingQueue: (2, 1, 3) Fjernet element: 2
Hvis du vil lære mer om det ArrayBlockingQueue
, kan du gå til Java ArrayBlockingQueue.
Hvorfor BlockingQueue?
I Java BlockingQueue
regnes det som den trådsikre samlingen. Det er fordi det kan være nyttig i operasjoner med flere tråder.
Anta at en tråd setter inn elementer i køen, og en annen tråd fjerner elementer fra køen.
Nå, hvis den første tråden går saktere, kan blokkeringskøen få den andre tråden til å vente til den første tråden fullfører driften.