In deze tutorial leren we over de Java BlockingQueue-interface en zijn methoden.
De BlockingQueue
interface van het Java- Collections
framework breidt de Queue
interface uit. Elke bewerking kan wachten totdat deze met succes kan worden uitgevoerd.
Als we bijvoorbeeld een element uit een lege wachtrij willen verwijderen, staat de blokkeerwachtrij de verwijderbewerking toe om te wachten tot de wachtrij enkele elementen bevat die moeten worden verwijderd.
Klassen die BlockingQueue implementeren
Aangezien het BlockingQueue
een interface is, kunnen we de directe implementatie ervan niet verzorgen.
Om de functionaliteit van de te gebruiken BlockingQueue
, moeten we klassen gebruiken die het implementeren.
- ArrayBlockingQueue
- LinkedBlockingQueue
Hoe blokkeer wachtrijen te gebruiken?
We moeten het java.util.concurrent.BlockingQueue
pakket importeren om te kunnen gebruiken BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Hier hebben we gemaakte objecten animal1 en animal2 van de klassen ArrayBlockingQueue
en LinkedBlockingQueue
, respectievelijk. Deze objecten kunnen de functionaliteiten van de BlockingQueue
interface gebruiken.
Methoden voor BlockingQueue
Afhankelijk van of een wachtrij vol of leeg is, kunnen de methoden van een blokkerende wachtrij worden onderverdeeld in 3 categorieën:
Methoden die een uitzondering genereren
add()
- Voegt een element toe aan de blokkeerwachtrij aan het einde van de wachtrij. Gooit een uitzondering als de wachtrij vol is.element()
- Geeft het hoofd van de blokkeerwachtrij terug. Genereert een uitzondering als de wachtrij leeg is.remove()
- Verwijdert een element uit de blokkeerwachtrij. Genereert een uitzondering als de wachtrij leeg is.
Methoden die enige waarde teruggeven
offer()
- Voegt het opgegeven element toe aan de blokkeerwachtrij aan het einde van de wachtrij. Retourneertfalse
als de wachtrij vol is.peek()
- Geeft het hoofd van de blokkeerwachtrij terug. Retourneertnull
als de wachtrij leeg is.poll()
- Verwijdert een element uit de blokkeerwachtrij. Retourneertnull
als de wachtrij leeg is.
Meer aanbod () en poll ()
De offer()
en poll()
methode kan worden gebruikt met time-outs. Dat wil zeggen, we kunnen tijdseenheden als parameter doorgeven. Bijvoorbeeld,
offer(value, 100, milliseconds)
Hier,
- waarde is het element dat in de wachtrij moet worden ingevoegd
- En we hebben een time-out van 100 milliseconden ingesteld
Dit betekent dat de offer()
methode zal proberen om een element gedurende 100
milliseconden in de blokkeerwachtrij in te voegen . Als het element niet binnen 100 milliseconden kan worden ingevoegd, retourneert de methode false
.
Opmerking: In plaats van milliseconds
, we hebben ook de volgende tijdseenheden kunt gebruiken: days
, hours
, minutes
, seconds
, microseconds
en nanoseconds
in offer()
en poll()
methoden.
Methoden die de bewerking blokkeren
Het BlockingQueue
biedt ook methoden om de bewerkingen te blokkeren en te wachten als de wachtrij vol of leeg is.
put()
- Voegt een element toe aan de blokkeerwachtrij. Als de wachtrij vol is, wacht deze totdat de wachtrij ruimte heeft om een element in te voegen.take()
- Verwijdert en retourneert een element uit de blokkeerwachtrij. Als de wachtrij leeg is, wacht deze tot de wachtrij elementen bevat die moeten worden verwijderd.
Stel dat we elementen in een wachtrij willen invoegen. Als de wachtrij vol is put()
, wacht de methode totdat de wachtrij ruimte heeft om elementen in te voegen.
Evenzo als we elementen uit een wachtrij willen verwijderen. Als de wachtrij leeg is take()
, wacht de methode tot de wachtrij elementen bevat die moeten worden verwijderd.
Implementatie van BlockingQueue in 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(); ) ) )
Uitvoer
BlockingQueue: (2, 1, 3) Element verwijderd: 2
Voor meer informatie over ArrayBlockingQueue
, bezoek Java ArrayBlockingQueue.
Waarom BlockingQueue?
In Java BlockingQueue
wordt het beschouwd als de threadveilige verzameling. Het is omdat het handig kan zijn bij bewerkingen met meerdere threads.
Stel dat een thread elementen in de wachtrij invoegt en een andere thread elementen uit de wachtrij verwijdert.
Als de eerste thread nu langzamer loopt, kan de blokkeringswachtrij de tweede thread laten wachten totdat de eerste thread zijn werking heeft voltooid.