Java BlockingQueue-interface

I denne vejledning lærer vi om Java BlockingQueue-grænsefladen og dens metoder.

Den BlockingQueuegrænsefladen af Java Collectionsrammer udvider Queuegrænsefladen. Det tillader enhver operation at vente, indtil den kan udføres med succes.

For eksempel, hvis vi vil slette et element fra en tom kø, så tillader den blokerende kø, at sletningen kan vente, indtil køen indeholder nogle elementer, der skal slettes.

Klasser, der implementerer BlockingQueue

Da det BlockingQueueer en grænseflade, kan vi ikke levere den direkte implementering af det.

For at kunne bruge funktionaliteten i BlockingQueue, skal vi bruge klasser, der implementerer den.

  • ArrayBlockingQueue
  • LinkedBlockingQueue

Hvordan bruges blokerende køer?

Vi skal importere java.util.concurrent.BlockingQueuepakken for at kunne bruge den BlockingQueue.

 // Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue(); 

Her har vi oprettet objekter animal1 og animal2 af henholdsvis klasser ArrayBlockingQueueog LinkedBlockingQueue. Disse objekter kan bruge funktionerne i BlockingQueuegrænsefladen.

Metoder til BlockingQueue

Baseret på om en kø er fuld eller tom, kan metoder til en blokeringskø opdeles i 3 kategorier:

Metoder, der kaster en undtagelse

  • add()- Indsætter et element i den blokerende kø i slutningen af ​​køen. Kaster en undtagelse, hvis køen er fuld.
  • element()- Returnerer hovedet på den blokerende kø. Kaster en undtagelse, hvis køen er tom.
  • remove()- Fjerner et element fra den blokerende kø. Kaster en undtagelse, hvis køen er tom.

Metoder, der returnerer en vis værdi

  • offer()- Indsætter det angivne element i den blokerende kø i slutningen af ​​køen. Returnerer, falsehvis køen er fuld.
  • peek()- Returnerer hovedet på den blokerende kø. Returnerer, nullhvis køen er tom.
  • poll()- Fjerner et element fra den blokerende kø. Returnerer, nullhvis køen er tom.

Mere på tilbud () og afstemning ()

Metoden offer()og poll()kan bruges med timeouts. Det vil sige, vi kan overføre tidsenheder som en parameter. For eksempel,

 offer(value, 100, milliseconds) 

Her,

  • værdi er det element, der skal indsættes i køen
  • Og vi har indstillet en timeout på 100 millisekunder

Dette betyder, at offer()metoden vil forsøge at indsætte et element i den blokerende kø i 100millisekunder. Hvis elementet ikke kan indsættes i 100 millisekunder, returneres metoden false.

Bemærk: I stedet for milliseconds, vi kan også bruge disse tidsenheder: days, hours, minutes, seconds, microsecondsog nanosecondsi offer()og poll()metoder.

Metoder, der blokerer for operationen

Dette BlockingQueuegiver også metoder til at blokere operationerne og vente, hvis køen er fuld eller tom.

  • put()- Indsætter et element i den blokerende kø. Hvis køen er fuld, venter den, indtil køen har plads til at indsætte et element.
  • take()- Fjerner og returnerer et element fra den blokerende kø. Hvis køen er tom, venter den, indtil køen har elementer, der skal slettes.

Antag, vi vil indsætte elementer i en kø. Hvis køen er fuld put(), venter metoden, indtil køen har plads til at indsætte elementer.

Tilsvarende, hvis vi vil slette elementer fra en kø. Hvis køen er tom take(), venter metoden, indtil køen indeholder elementer, der skal slettes.

Implementering af BlockingQueue i 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 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(); ) ) ) 

Produktion

 BlockingQueue: (2, 1, 3) Fjernet element: 2 

For at lære mere om det ArrayBlockingQueue, besøg Java ArrayBlockingQueue.

Hvorfor BlockingQueue?

I Java BlockingQueuebetragtes det som den trådsikre samling. Det er fordi det kan være nyttigt i multi-threading-operationer.

Antag at en tråd indsætter elementer i køen, og en anden tråd fjerner elementer fra køen.

Hvis den første tråd nu kører langsommere, kan den blokerende kø få den anden tråd til at vente, indtil den første tråd er færdig med operationen.

Interessante artikler...