Vad är BlockingQueue i Java och hur man implementerar det?



Den här artikeln om BlockingQueue i Java hjälper dig att lära dig mer om BlockingQueue-gränssnittet. Det ger dig också inblick i dess metoder och praktiska implementering

är extremt populärt bland programmerare på grund av dess omfattande utbud av inbyggda funktioner. Oftast kommer du att ha en dedikerad lösning för ditt problem redan innan det dyker upp. En sådan extremt användbar och viktig del av är BlockingQueue-gränssnittet i Java. Genom denna artikel kommer jag att kasta lite ljus på BlockingQueue i Java och metoderna för att implementera den.

datatyper i mysql med exempel

Nedan följer ämnena i denna artikel:





BlockingQueue-gränssnitt i Java

BlockingQueue i Java är ett gränssnitt som har lagts till i Java 1.5 tillsammans med några andra samtidiga verktygsklasser som ConcurrentHashMap, CopyOnWriteArrrayList, etc. BlockingQueue-gränssnittet tillhör java.util.concurrent paket .Detta gränssnitt förbättrar flödeskontrollen genom att aktivera blockering, om en tråd försöker dequeue en tom kö eller enqueue en fullständig kö. I båda fallen kommer detta gränssnitt till nytta.I enklare termer, anta a försöker lägga till element i en redan full kö. Vid denna punkt i programmet kommer BlockingQueue att åberopas som blockerar den specifika tråden tills en annan tråd släpper kön för att skapa utrymme. Detta kan vara ett resultat av antingen dequeuing av ett eller flera element i hela kön. På samma sätt kommer BlockingQueue att åberopas för att blockera en tråd som försöker dequeue en redan tom kö tills några andra trådar infogar eller lägger till ett element i det tomma .

När du arbetar med BlockingQueue-gränssnittet i Java måste du komma ihåg att det inte accepterar ett nullvärde. Om du försöker göra det kommer det omedelbart att kasta ett NullPointerException. Figuren nedan representerar funktionen för BlockingQueue-gränssnittet i Java.



BlockingQueue - BlockingQueue i Java - EdurekaDetta gränssnitt används främst mellan producent-konsumenter eftersom det är tråd-säkert.Vad jag menar är att BlockingQueue-gränssnittet kan användas för att skapa en kö som kan delas av både producenten och konsumenten

För att kunna arbeta med BlockingQueue i Java måste du först bekanta dig med dess typer. Låt mig presentera dig för dem i nästa avsnitt i den här artikeln.

Typer av konstruktörer för BlockingQueue i Java

Det finns två typer av konstruktörer för BlockingQueue-gränssnitt i Java:



  • Obegränsad kö: För denna typ av kö kommer kapaciteten att ställas in på Integer.MAX_VALUE. En obegränsad kö kommer aldrig att blockeras eftersom den kan växa dynamiskt, varje gång ett element sätts in i det. Nedan är syntaxen för att skapa en obegränsad kö:
BlockingQueue bq = new LinkedBlockingDeque ()
  • Avgränsad kö: För den här typen av kö måste du passera köns kapacitet vid tidpunkten för skapandet, dvs som en byggare parameter. När storleken har tilldelats kan den inte ändras. Nedan är syntaxen för att skapa en begränsad kö:
BlockingQueue bq = new LinkedBlockingDeque (10)

Nu när du är bekant med sätten att implementera BlockingQueue i Java, låt mig lista några av dess metoder.

Metoder i BlockingQueue-gränssnittet

Metod Beskrivning
boolesk tillsats (E e) Denna metod hjälper till att infoga det angivna elementet i den här kön om det finns utrymme i kön annars kommer detkasta enIllegalStateException
boolean innehåller (Objekt o) Den här metoden returnerar true om kön innehåller det angivna elementet
int drainTo (samling c) Denna metod tar bort alla tillgängliga element från kön och lägger till dem i den angivna samlingen
int drainTo (Collection c, int maxElements) Denna metod tar bort det angivna antalet tillgängliga element från kön och lägger till dem i det angivna
booloean erbjudande (E e) Den här metoden infogar det angivna elementet i kön om det inte är fullt och returnerar true, annars returnerar det false
booleskt erbjudande (E e, lång timeout, TimeUnit-enhet) Den här metoden infogar det angivna elementet i kön. Om kön är full väntar den upp till den angivna väntetiden tills utrymmet blir tillgängligt.
E-undersökning (lång tidsavbrott, TimeUnit-enhet) Denna metod hjälper till att hämta och ta bort köets huvud. Om kön är tom väntar den upp till den angivna väntetiden tills ett element blir tillgängligt
void put (E e) Denna metod infogar det angivna elementet i kön genom att vänta på att utrymme blir tillgängligt om kön är full
int återstående kapacitet () Denna metod hjälper till att returnera antalet ytterligare element som den här kön helst kan acceptera utan att blockeras
boolean ta bort (Objekt o) Den här metoden tar bara bort en enda instans av det angivna elementet från kön om det finns
E ta () Denna metod hjälper till att hämta och ta bort huvudet på kön genom att vänta på att ett element blir tillgängligt, om kön är tom.

BlockingQueue-implementeringar

Här kommer jag att implementera ett enkelt exempel på BlockingQueue i Java varklass EduProducer kommer att generera data och infoga den i en , samtidigt, en annan klass, EduConsumer tar bort data från samma kö.

För detta kommer jag att skapa tre klasser, nämligen:

  1. EduProducer
  2. EduConsumer
  3. Edureka Huvud

Låt oss nu skapa var och en av dessa klasser en efter en.

EduProducer.java

paket edureka importera java.util.concurrent.BlockingQueue public class EduProducer implementerar Runnable {privat final BlockingQueue-kö @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } privat ogiltig process () kastar InterruptedException {// Sätt 10 in i kö för (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

paket edureka importera java.util.concurrent.BlockingQueue public class EduConsumer implementerar Runnable {privat final BlockingQueue queue @ Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Interrupt ()}} privat ogiltig process (heltal tar) kastar InterruptedException {System.out.println ('[Consumer] Ta bort:' + take) Thread.sleep (500)} public EduConsumer (BlockingQueue queue) {this.queue = queue}}

EdurekaMain.java

paket edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer (queue)) .start () ny tråd (ny EduConsumer (kö)). start ()}}

När du är klar med att skriva koden, kör du programmet för att få utmatningen nedan:

[Producent] Lägg till: 0 [Konsument] Ta: 0 [Producent] Köens återstående kapacitet: 9 [Producent] Lägg till: 1 [Producent] Köens återstående kapacitet: 9 [Producent] Lägg till: 2 [Producent] Köens återstående kapacitet: 8 [Producent ] Lägg till: 3 [Producent] Köens återstående kapacitet: 7 [Konsument] Ta: 1 [Producent] Lägg till: 4 [Producent] Köens återstående kapacitet: 7 [Producent] Lägg till: 5 [Producent] Köens återstående kapacitet: 6 [Producent] Lägg till : 6 [Producent] Köens återstående kapacitet: 5 [Konsument] Ta: 2 [Producent] Lägg till: 7 [Producent] Köens återstående kapacitet: 5 [Producent] Lägg till: 8 [Producent] Köens återstående kapacitet: 4 [Producent] Lägg till: 9 [Producent] Köens återstående kapacitet: 3 [Konsument] Ta: 3 [Konsument] Ta: 4 [Konsument] Ta: 5 [Konsument] Ta: 6 [Konsument] Ta: 7 [Konsument] Ta: 8 [Konsument] Ta: 9

Detta tar oss till slutet av den här artikeln om BlockingQueue i Java. Om du vill lära dig Java mer detaljerat kan du hänvisa till vår också.

Nu när du har förstått grunderna för BlockingQueue i Java, kolla in av Edureka, ett pålitligt inlärningsföretag online med ett nätverk av mer än 250 000 nöjda elever spridda över hela världen. Edurekas Java J2EE- och SOA-utbildning och certifieringskurs är utformad för studenter och yrkesverksamma som vill vara Java-utvecklare. Kursen är utformad för att ge dig ett försprång till Java-programmering och träna dig för både kärn- och avancerade Java-koncept tillsammans med olika Java-ramverk som Hibernate & Spring.

Har du en fråga till oss? Vänligen nämna det i kommentarsektionen i denna “BlockingQueue in Java” så återkommer vi till dig så snart som möjligt.