Java >> Java Program >  >> Tag >> Queue

BlockingQueue-gränssnitt i Java

BlockingQueue-gränssnitt i Java

BlockingQueue är ett gränssnitt i Java som är en del av Java concurrency-verktyget java.util.concurrent paket. Det är en köimplementering som blockerar tråden under insättnings- och raderingsoperationer. Detta innebär att den blockerar tråden när kön har nått sin maximala kapacitet under insättningsoperationen. På samma sätt blockerar den tråden när kön är tom under raderingsoperationen. BlockingQueue har 2 trådar där 1 tråd är en producent som sätter in elementen i kön medan den andra tråden är en konsument som tar bort elementen från kön

Implementeringar av en BlockingQueue

Klasserna nedan implementerar BlockingQueue-gränssnittet i Java:

  • ArrayBlockingQueue
  • DelayQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue
  • Synchronous Queue

Typer av blockeringskö

BlockingQueue-gränssnittet i Java kan vara av två typer:

  • Ogränsad kö :I en UnboundedQueue kommer köns kapacitet att vara maximal vilket innebär att när vi infogar element expanderar köns storlek. Därför kommer det aldrig att finnas ett tillstånd där det kommer att blockeras. Storleken på kön kommer att vara heltal.MAX_VALUE.
    BlockingQueue bq = new LinkedBlockingDeque();
  • Begränsad kö :I en avgränsad kö kan vi deklarera storleken på kön genom att skicka kapacitetsargumentet till konstruktorn. I det här fallet bestämmer vi köns kapacitet.
    BlockingQueue bq = new LinkedBlockingDeque(int capacity);

Att fungera med en blockeringskö

Java BlockingQueue-gränssnittet har alltid en producent- och en konsumenttråd där producenten fortsätter att infoga element i kön och konsumenttråden fortsätter att hämta element från kön. Producenttråden blockerar när kön inte har mer kapacitet att infoga element och väntar därför tills konsumenttråden tar bort elementen. På samma sätt blockerar konsumenttråden när det inte finns fler element att hämta från kön och väntar tills producenttråden infogar ett element.

Metoder för Java BlockingQueue

Nedan är metoderna för Java BlockingQueue-gränssnittet.

Metoder Beskrivning
boolean add(heltal e) Infogar ett element i kön
boolean contains(Object o) Returnerar sant om kön innehåller det angivna elementet
int drainTo(Collection c) Tar bort alla element från kön och flyttar den till den angivna samlingen. Den returnerar antalet överförda element
int drainTo(Collection c, int maxElements) Tar bort det maximala antalet element från kön och lägger till dem i den angivna samlingen
booleskt erbjudande(heltal e) Infogar det angivna elementet
booleskt erbjudande (heltal e, lång timeout, TimeUnit timeunit) Infogar det angivna elementet i kön efter att ha väntat på den angivna timeouten om utrymme inte är tillgängligt
Heltalsundersökning (lång timeout, TimeUnit timeunit) Hämtar och tar bort huvudet på elementet efter att ha väntat på angiven tid
void put(heltal e) Infogar det angivna elementet i kön
int remainingCapacity() Returnerar antalet element den kan acceptera utan att blockera kön
boolean remove(Object e) Tar bort det angivna elementet från kön
Integer take() Hämtar och tar bort huvudet i kön

Exempel på Java BlockingQueue

Detta är ett typiskt exempel på ett Java BlockingQueue-gränssnitt där en tråd infogar element i kön medan den andra tråden tar bort elementen från kön. Vi inkluderar en sömntid efter varje put() metod så att tråden blockerar innan nästa element sätts in så att det finns tillräckligt med kökapacitet. Använda take() metod kan vi ta bort och hämta huvudelementet från kön.

import java.util.concurrent.*;

public class BlockingQueueDemo {

  public static void main(String[] args) {
    BlockingQueue<Integer> bq = new ArrayBlockingQueue<Integer>(10);
    insertElements add = new insertElements(bq);
    removeElements remove = new removeElements(bq);
    
    new Thread(add).start();
    new Thread(remove).start();

  }

}

class insertElements implements Runnable {
  
  protected BlockingQueue bq = null;
  
  insertElements(BlockingQueue bq) {
    this.bq = bq;
  }

  public void run() {
    try {
      bq.put(10);
      Thread.sleep(1000);
      bq.put(20);
      Thread.sleep(1000);
      bq.put(30);
    }
    catch(InterruptedException e){
      e.printStackTrace();
    }
  }
  
}

class removeElements implements Runnable {
  
  protected BlockingQueue bq = null;
  
  removeElements(BlockingQueue bq) {
    this.bq = bq;
  }
  
  public void run() {
    try {
      System.out.println(bq.take());
      System.out.println(bq.take());
      System.out.println(bq.take());
    }
    catch(InterruptedException e) {
      e.printStackTrace();
    }
  }
}
10
20
30

Exempel:Infoga element

Nedan är ett exempel på att infoga element i en kö med add() , offer() och put() metod för Java BlockingQueue-gränssnitt. Anta att kapaciteten för blockeringskön var 5 och vi anropar sedan offer() metod, blockerar den tråden tills det finns en kapacitet för kön att lägga till element.

import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(10);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Pyhton");
    bq.add("Perl");
    
    System.out.println("Elements in the blockingqueue: " + bq);

    bq.offer("Ruby");
    bq.put("VBScript");
    System.out.println("Elements in the blockingqueue: " + bq);

  }

}
Elements in the blockingqueue: [Java, C, C++, Pyhton, Perl]
Elements in the blockingqueue: [Java, C, C++, Python, Perl, Ruby, VBScript]

Exempel:Ta bort element

Nedan är ett exempel på att ta bort element från kön med remove() , take() och poll() metod som finns i Java BlockingQueue-gränssnittet.

import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(5);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Python");
    bq.add("Perl");
    
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.remove("C++");
    bq.take();
    
    bq.offer("Ruby");
    bq.put("VBScript");
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.poll(2, TimeUnit.SECONDS);
    System.out.println("Elements in the blockingqueue: " + bq);

  }

}
Elements in the blockingqueue: [Java, C, C++, Python, Perl]
Elements in the blockingqueue: [C, Python, Perl, Ruby, VBScript]
Elements in the blockingqueue: [Python, Perl, Ruby, VBScript]

Exempel:Åtkomstelement

Det här exemplet visar de olika metoderna för att hämta huvudelementet från kön som element() och peek() som är en del av Java BlockingQueue-gränssnittet. Dessa metoder hämtar bara elementet och tar inte bort det från kön. Vi kan också kontrollera om ett element finns i kön med contains() metod.

import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(5);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Python");
    bq.add("Perl");
    
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.remove("C++");
    bq.take();
    System.out.println("Elements in the queue afer remove operation: " + bq);
    System.out.println("Head element: " + bq.peek());
    
    bq.offer("Ruby");
    bq.put("VBScript");
    System.out.println("Elements in the blockingqueue: " + bq);
    
    bq.poll(2, TimeUnit.SECONDS);
    System.out.println("Elements in the blockingqueue: " + bq);
    
    System.out.println("Head element: " + bq.element());
    
    System.out.println(bq.contains("Ruby"));
    

  }

}
Elements in the blockingqueue: [Java, C, C++, Python, Perl]
Elements in the queue afer remove operation: [C, Python, Perl]
Head element: C
Elements in the blockingqueue: [C, Python, Perl, Ruby, VBScript]
Elements in the blockingqueue: [Python, Perl, Ruby, VBScript]
Head element: Python
true

Exempel:Iterering av element i BlockingQueue

Vi kan iterera genom elementen med iterator() metod som finns i Java BlockingQueue-gränssnittet. Den kommer åt varje element i iteratorn med hjälp av next() metod. Vi kan få storleken på kön med size() metod och hämta den tillgängliga kapaciteten efter att ha lagt till element med remainingCapacity() metod.

import java.util.Iterator;
import java.util.concurrent.*;

public class BlockingQueueEx {

  public static void main(String[] args) throws InterruptedException {
    BlockingQueue<String> bq = new ArrayBlockingQueue<String>(5);
    
    bq.add("Java");
    bq.add("C");
    bq.add("C++");
    bq.add("Python");
    bq.add("Perl");
    
    System.out.println("Size of the queue: " + bq.size());
    
    Iterator<String> it = bq.iterator();
    while(it.hasNext())
      System.out.println(it.next());
    System.out.println("Remaining capacity: " + bq.remainingCapacity());

  }

}
Size of the queue: 5
Java
C
C++
Python
Perl
Remaining capacity: 0

Java-tagg