Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

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. Retourneert false als de wachtrij vol is.
  • peek() - Retourneert de kop van de blokkerende wachtrij. Retourneert null als de wachtrij leeg is.
  • poll() - Verwijdert een element uit de blokkeerwachtrij. Retourneert null 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

  1. Java-operators
  2. Java-opmerkingen
  3. Java if... else-instructie
  4. Java voor elke lus
  5. Java-strings
  6. Java-interface
  7. Java anonieme klasse
  8. Java proberen-met-bronnen
  9. Java-annotaties
  10. Java-beweringen
  11. Java-vector