Java-blokkeringswachtrij
Java BlockingQueue
In deze zelfstudie leren we over de Java BlockingQueue-interface en zijn methoden.
De BlockingQueue
interface van de Java Collections
framework breidt de Queue
. uit koppel. Hiermee kan elke bewerking wachten totdat deze met succes kan worden uitgevoerd.
Als we bijvoorbeeld een element uit een lege wachtrij willen verwijderen, laat de blokkeerwachtrij toe dat de verwijderbewerking wacht tot de wachtrij enkele elementen bevat die moeten worden verwijderd.
Klassen die BlockingQueue implementeren
Sinds BlockingQueue
is een interface, kunnen we de directe implementatie ervan niet bieden.
Om de functionaliteit van de BlockingQueue
. te gebruiken , we moeten klassen gebruiken die het implementeren.
- ArrayBlockingQueue
- LinkedBlockingQueue
Hoe blokkeerwachtrijen gebruiken?
We moeten de java.util.concurrent.BlockingQueue
. importeren pakket om BlockingQueue
. te gebruiken .
// Array implementation of BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
// LinkedList implementation of BlockingQueue
BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Hier hebben we objecten animal1 . gemaakt en dier2 van klassen ArrayBlockingQueue
en LinkedBlockingQueue
, respectievelijk. Deze objecten kunnen gebruik maken van de functionaliteiten van de BlockingQueue
interface.
Methoden van BlockingQueue
Afhankelijk van of een wachtrij vol of leeg is, kunnen de methoden van een blokkeerwachtrij worden onderverdeeld in 3 categorieën:
Methoden die een uitzondering veroorzaken
add()
- Voegt een element toe aan de blokkeerwachtrij aan het einde van de wachtrij. Gooit een uitzondering als de wachtrij vol is.element()
- Retourneert de kop van de blokkerende wachtrij. Gooit een uitzondering als de wachtrij leeg is.remove()
- Verwijdert een element uit de blokkeerwachtrij. Gooit een uitzondering als de wachtrij leeg is.
Methoden die een bepaalde waarde teruggeven
offer()
- Voegt het opgegeven element toe aan de blokkeerwachtrij aan het einde van de wachtrij. Retourneertfalse
als de wachtrij vol is.peek()
- Retourneert de kop van de blokkerende wachtrij. 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 doorgeven als parameter. 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 een element in de blokkeerwachtrij in te voegen voor 100
milliseconden. Als het element niet binnen 100 milliseconden kan worden ingevoegd, retourneert de methode false
.
Opmerking: In plaats van milliseconds
, kunnen we ook deze tijdseenheden gebruiken:days
, hours
, minutes
, seconds
, microseconds
en nanoseconds
in offer()
en poll()
methoden.
Methoden die de bewerking blokkeren
De 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, wordt gewacht tot de wachtrij ruimte heeft om een element in te voegen.take()
- Verwijdert en retourneert een element uit de blokkeerwachtrij. Als de wachtrij leeg is, wordt gewacht tot de wachtrij elementen bevat die moeten worden verwijderd.
Stel dat we elementen in een wachtrij willen invoegen. Als de wachtrij vol is, dan is de put()
methode wacht totdat de wachtrij ruimte heeft om elementen in te voegen.
Evenzo, als we elementen uit een wachtrij willen verwijderen. Als de wachtrij leeg is, dan is de take()
methode wacht totdat 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<Integer> 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] Removed Element: 2
Voor meer informatie over ArrayBlockingQueue
, bezoek Java ArrayBlockingQueue.
Waarom BlockingQueue?
In Java, BlockingQueue
wordt beschouwd als de thread-safe verzameling. Het is omdat het nuttig kan zijn bij multi-threading operaties.
Stel dat een thread elementen toevoegt aan de wachtrij en een andere thread elementen uit de wachtrij verwijdert.
Als de eerste thread nu langzamer loopt, kan de blokkeerwachtrij de tweede thread laten wachten totdat de eerste thread zijn bewerking voltooit.
Java