Java BlockingQueue-grensesnitt

I denne opplæringen vil vi lære om Java BlockingQueue-grensesnittet og dets metoder.

Den BlockingQueuegrensesnittet til Java Collectionsrammeverk utvider Queuegrensesnittet. Den lar enhver operasjon vente til den kan utføres.

Hvis vi for eksempel vil slette et element fra en tom kø, lar blokkeringskøen sletteoperasjonen vente til køen inneholder noen elementer som skal slettes.

Klasser som implementerer BlockingQueue

Siden BlockingQueueer et grensesnitt, kan vi ikke gi den direkte implementeringen av det.

For å kunne bruke funksjonaliteten til BlockingQueue, må vi bruke klasser som implementerer den.

  • ArrayBlockingQueue
  • LinkedBlockingQueue

Hvordan bruker jeg blokkeringskøer?

Vi må importere java.util.concurrent.BlockingQueuepakken for å kunne bruke den BlockingQueue.

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

Her har vi laget objekter animal1 og animal2 av klasser ArrayBlockingQueueog LinkedBlockingQueuehenholdsvis. Disse objektene kan bruke funksjonene til BlockingQueuegrensesnittet.

Metoder for BlockingQueue

Basert på om en kø er full eller tom, kan metoder for blokkeringskø deles inn i 3 kategorier:

Metoder som kaster et unntak

  • add()- Setter inn et element i blokkeringskøen på slutten av køen. Kaster et unntak hvis køen er full.
  • element()- Returnerer hodet til blokkeringskøen. Kaster et unntak hvis køen er tom.
  • remove()- Fjerner et element fra blokkeringskøen. Kaster et unntak hvis køen er tom.

Metoder som gir noe verdi

  • offer()- Setter inn det angitte elementet i blokkeringskøen på slutten av køen. Returnerer falsehvis køen er full.
  • peek()- Returnerer hodet til blokkeringskøen. Returnerer nullhvis køen er tom.
  • poll()- Fjerner et element fra blokkeringskøen. Returnerer nullhvis køen er tom.

Mer på tilbud () og avstemning ()

Den offer()og poll()fremgangsmåten kan brukes med tidsavbrudd. Det vil si at vi kan overføre tidsenheter som en parameter. For eksempel,

 offer(value, 100, milliseconds) 

Her,

  • verdi er elementet som skal settes inn i køen
  • Og vi har satt en timeout på 100 millisekunder

Dette betyr at offer()metoden vil prøve å sette inn et element i blokkeringskøen i 100millisekunder. Hvis elementet ikke kan settes inn på 100 millisekunder, returnerer metoden false.

Merk: I stedet for milliseconds, kan vi også bruke disse tidsenheter: days, hours, minutes, seconds, microsecondsog nanosecondsi offer()og poll()metoder.

Metoder som blokkerer operasjonen

Dette BlockingQueuegir også metoder for å blokkere operasjonene og vente på at køen er full eller tom.

  • put()- Setter inn et element i blokkeringskøen. Hvis køen er full, vil den vente til køen har plass til å sette inn et element.
  • take()- Fjerner og returnerer et element fra blokkeringskøen. Hvis køen er tom, vil den vente til køen har elementer som skal slettes.

Anta at vi ønsker å sette inn elementer i en kø. Hvis køen er full vil put()metoden vente til køen har plass til å sette inn elementer.

Tilsvarende hvis vi vil slette elementer fra en kø. Hvis køen er tom, vil take()metoden vente til køen inneholder elementer som skal slettes.

Implementering av 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(); ) ) ) 

Produksjon

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

Hvis du vil lære mer om det ArrayBlockingQueue, kan du gå til Java ArrayBlockingQueue.

Hvorfor BlockingQueue?

I Java BlockingQueueregnes det som den trådsikre samlingen. Det er fordi det kan være nyttig i operasjoner med flere tråder.

Anta at en tråd setter inn elementer i køen, og en annen tråd fjerner elementer fra køen.

Nå, hvis den første tråden går saktere, kan blokkeringskøen få den andre tråden til å vente til den første tråden fullfører driften.

Interessante artikler...