Wat is BlockingQueue in Java en hoe moet het worden geïmplementeerd?



Dit artikel over BlockingQueue in Java zal u helpen meer te weten te komen over de BlockingQueue-interface. Het geeft u ook inzicht in de methoden en praktische implementatie ervan

is enorm populair onder programmeurs vanwege de uitgebreide reeks ingebouwde functies. Meestal heeft u een speciale oplossing voor uw probleem, zelfs voordat het verschijnt. Zo'n buitengewoon nuttig en belangrijk onderdeel van is de BlockingQueue-interface in Java. Door middel van dit artikel zal ik wat licht werpen op BlockingQueue in Java en de methoden om het te implementeren.

Hieronder staan ​​de onderwerpen die in dit artikel worden behandeld:





lees xml-bestand in java-voorbeeld

BlockingQueue-interface in Java

BlockingQueue in Java is een interface die is toegevoegd in Java 1.5 samen met een paar andere gelijktijdige Utility-klassen zoals ConcurrentHashMap, CopyOnWriteArrrayList, enz. BlockingQueue-interface behoort tot de java.util.concurrent pakket .Deze interface verbetert de stroomcontrole door blokkering te activeren, voor het geval een thread probeert een lege wachtrij of een volledige wachtrij uit de wachtrij te halen. In beide gevallen is deze interface handig.Stel, in eenvoudiger bewoordingen, a probeert elementen toe te voegen aan een reeds volle wachtrij. Op dit punt in het programma wordt BlockingQueue aangeroepen, waardoor die specifieke thread wordt geblokkeerd totdat een andere thread de wachtrij vrijgeeft om ruimte vrij te maken. Dit kan het resultaat zijn van het uit de wachtrij halen van een of meer elementen van het opruimen van de hele wachtrij. Evenzo zal BlockingQueue worden aangeroepen om een ​​thread te blokkeren die probeert een reeds lege wachtrij te verwijderen totdat een andere thread een element invoegt of toevoegt aan de lege wachtrij. wachtrij .

Wanneer u met de BlockingQueue-interface in Java werkt, moet u er rekening mee houden dat deze geen null-waarde accepteert. Als u dat probeert, wordt er onmiddellijk een NullPointerException gegenereerd. De onderstaande afbeelding geeft de werking weer van de BlockingQueue-interface in Java.



BlockingQueue - BlockingQueue in Java - EdurekaDeze koppel wordt voornamelijk gebruikt tussen Producent-Consumenten omdat het Thread-Safe is.Wat ik bedoel is dat de BlockingQueue-interface kan worden gebruikt om een ​​wachtrij te maken die kan worden gedeeld door zowel de producent als de consument

Om met BlockingQueue in Java te kunnen werken, moet u eerst vertrouwd raken met de typen ervan. Laat me je aan hen voorstellen in de volgende sectie van dit artikel.

Typen constructeurs voor BlockingQueue in Java

Er zijn twee soorten constructors voor BlockingQueue-interface in Java:



  • Onbegrensde wachtrij: Voor dit type wachtrij wordt de capaciteit ingesteld op Integer.MAX_VALUE. Een onbegrensde wachtrij wordt nooit geblokkeerd, omdat deze dynamisch kan groeien, elke keer dat er een element in wordt ingevoegd. Hieronder vindt u de syntaxis om een ​​onbegrensde wachtrij te maken:
BlockingQueue bq = nieuwe LinkedBlockingDeque ()
  • Begrensde wachtrij: Voor dit soort wachtrijen moet u de capaciteit van de wachtrij doorgeven op het moment dat deze wordt gemaakt, d.w.z. als een bouwer parameter. Als de maat eenmaal is toegewezen, kan deze niet worden gewijzigd. Hieronder vindt u de syntaxis om een ​​begrensde wachtrij te maken:
BlockingQueue bq = nieuwe LinkedBlockingDeque (10)

Nu u bekend bent met de manieren om BlockingQueue in Java te implementeren, wil ik een paar van de methoden opsommen.

Methoden in BlockingQueue-interface

Methode Omschrijving
boolean add (E e) Deze methode helpt bij het invoegen van het opgegeven element in deze wachtrij als er ruimte in de wachtrij is, anders zal het dat doengooi eenIllegalStateException
boolean bevat (Object o) Deze methode retourneert true als de wachtrij het opgegeven element bevat
int drainTo (Collectie c) Met deze methode worden alle beschikbare elementen uit de wachtrij verwijderd en aan de opgegeven verzameling toegevoegd
int drainTo (Collectie c, int maxElements) Deze methode verwijdert bij het opgegeven aantal beschikbare elementen uit de wachtrij en voegt ze toe aan het opgegeven
booloean aanbieding (E e) Deze methode zal het gespecificeerde element in de wachtrij invoegen als het niet vol is en true retourneren, anders zal het false retourneren
booleaanse aanbieding (E e, lange time-out, TimeUnit-eenheid) Met deze methode wordt het opgegeven element in de wachtrij ingevoegd. Als de wachtrij vol is, wacht deze tot de opgegeven wachttijd voordat de ruimte beschikbaar komt.
E poll (lange time-out, TimeUnit-eenheid) Deze methode helpt bij het ophalen en verwijderen van de kop van de wachtrij. Als de wachtrij leeg is, wacht deze tot de opgegeven wachttijd voordat een element beschikbaar komt
leegte gezet (E e) Deze methode zal het gespecificeerde element in de wachtrij invoegen door te wachten tot er ruimte beschikbaar komt in het geval de wachtrij vol is
int resterendeCapaciteit () Deze methode helpt bij het retourneren van het aantal aanvullende elementen dat deze wachtrij idealiter kan accepteren zonder te worden geblokkeerd
boolean remove (Object o) Met deze methode wordt een enkele instantie van het opgegeven element alleen uit de wachtrij verwijderd als deze aanwezig is
E nemen () Deze methode helpt bij het ophalen en verwijderen van de kop van de wachtrij door te wachten tot een element beschikbaar komt, voor het geval de wachtrij leeg is.

BlockingQueue-implementaties

Hier zal ik een eenvoudig voorbeeld van BlockingQueue in Java implementeren waarclass EduProducer genereert de gegevens en voegt deze in een wachtrij Tegelijkertijd zal een andere klasse, EduConsumer, de gegevens uit dezelfde wachtrij verwijderen.

Hiervoor ga ik 3 klassen aanmaken namelijk:

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

Laten we nu elk van deze klassen een voor een maken.

EduProducer.java

pakket edureka import java.util.concurrent.BlockingQueue openbare klasse EduProducer implementeert Runnable {privé definitieve BlockingQueue-wachtrij @Override public void run () {probeer {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } private void process () gooit InterruptedException {// Zet 10 ints in wachtrij voor (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

pakket edureka import java.util.concurrent.BlockingQueue public class EduConsumer implementeert Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Interrupt ()}} privé ongeldig proces (Integer take) gooit InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} openbaar EduConsumer (BlockingQueue-wachtrij) {this.queue = wachtrij}}

EdurekaMain.java

pakket edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue wachtrij = nieuwe LinkedBlockingQueue (10) nieuwe Thread (nieuwe EduProducer (wachtrij)) .start () nieuwe discussie (nieuwe EduConsumer (wachtrij)). start ()}}

Als u klaar bent met het schrijven van de code, voert u het programma uit om de onderstaande uitvoer te krijgen:

[Producer] Toevoegen: 0 [Consument] Take: 0 [Producer] Resterende capaciteit wachtrij: 9 [Producent] Toevoegen: 1 [Producent] Resterende capaciteit wachtrij: 9 [Producent] Toevoegen: 2 [Producent] Resterende capaciteit wachtrij: 8 [Producent ] Toevoegen: 3 [Producer] Resterende capaciteit wachtrij: 7 [Consument] Aantal: 1 [Producent] Toevoegen: 4 [Producer] Resterende capaciteit wachtrij: 7 [Producent] Toevoegen: 5 [Producent] Resterende capaciteit wachtrij: 6 [Producent] Toevoegen : 6 [Producer] Resterende capaciteit wachtrij: 5 [Consument] Aantal: 2 [Producent] Toevoegen: 7 [Producer] Resterende capaciteit wachtrij: 5 [Producent] Toevoegen: 8 [Producent] Resterende capaciteit wachtrij: 4 [Producent] Toevoegen: 9 [Producer] Resterende capaciteit wachtrij: 3 [Consument] Take: 3 [Consument] Take: 4 [Consument] Take: 5 [Consument] Take: 6 [Consument] Take: 7 [Consument] Take: 8 [Consument] Take: 9

Dit brengt ons bij het einde van dit artikel over BlockingQueue in Java. Als u Java in meer detail wilt leren, kunt u onze ook.

Nu je de basisprincipes van BlockingQueue in Java hebt begrepen, kun je het door Edureka, een vertrouwd online leerbedrijf met een netwerk van meer dan 250.000 tevreden leerlingen verspreid over de hele wereld. Edureka's training en certificering voor Java J2EE en SOA is bedoeld voor studenten en professionals die Java-ontwikkelaar willen worden. De cursus is ontworpen om u een voorsprong te geven in Java Programmeren en u te trainen in zowel kern- als geavanceerde Java-concepten samen met verschillende Java-frameworks zoals Hibernate & Spring.

Java class loader interviewvragen

Heeft u een vraag voor ons? Vermeld het in het commentaargedeelte van deze 'BlockingQueue in Java' en we nemen zo snel mogelijk contact met u op.