Java BlockingQueue-gränssnitt

I den här handledningen lär vi oss om Java BlockingQueue-gränssnittet och dess metoder.

Den BlockingQueuegränssnittet för Java Collectionsram utökar Queuegränssnittet. Det gör att varje operation kan vänta tills den kan utföras framgångsrikt.

Till exempel, om vi vill ta bort ett element från en tom kö, låter den blockerande köen att raderingen väntar tills kön innehåller några element som ska raderas.

Klasser som implementerar BlockingQueue

Eftersom det BlockingQueueär ett gränssnitt kan vi inte tillhandahålla direkt implementering av det.

För att kunna använda funktionaliteten i BlockingQueue, måste vi använda klasser som implementerar den.

  • ArrayBlockingQueue
  • LinkedBlockingQueue

Hur använder jag blockerande köer?

Vi måste importera java.util.concurrent.BlockingQueuepaketet för att kunna använda det BlockingQueue.

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

Här har vi skapat föremål animal1 och animal2 klasser ArrayBlockingQueueoch LinkedBlockingQueuerespektive. Dessa objekt kan använda BlockingQueuegränssnittets funktioner .

Metoder för BlockingQueue

Baserat på om en kö är full eller tom kan metoder för en blockerande kö delas in i tre kategorier:

Metoder som ger ett undantag

  • add()- Infogar ett element i blockeringskön i slutet av kön. Kaster ett undantag om kön är full.
  • element()- Returnerar spärrköns huvud. Kaster ett undantag om kön är tom.
  • remove()- Tar bort ett element från blockeringskön. Kaster ett undantag om kön är tom.

Metoder som returnerar något värde

  • offer()- Infogar det angivna elementet i blockeringskön i slutet av kön. Returnerar falseom kön är full.
  • peek()- Returnerar spärrköns huvud. Returnerar nullom kön är tom.
  • poll()- Tar bort ett element från blockeringskön. Returnerar nullom kön är tom.

Mer på erbjudande () och omröstning ()

Den offer()och poll()metoden kan användas med timeouts. Det vill säga vi kan skicka tidsenheter som en parameter. Till exempel,

 offer(value, 100, milliseconds) 

Här,

  • värde är det element som ska infogas i kön
  • Och vi har ställt in en timeout på 100 millisekunder

Detta innebär att offer()metoden kommer att försöka infoga ett element i blockeringskön i 100millisekunder. Om elementet inte kan infogas på 100 millisekunder returneras metoden false.

Notera: I stället för milliseconds, kan vi också använda dessa tidsenheter: days, hours, minutes, seconds, microsecondsoch nanosecondsi offer()och poll()metoder.

Metoder som blockerar operationen

Det BlockingQueueger också metoder för att blockera operationerna och vänta om kön är full eller tom.

  • put()- Infogar ett element i blockeringskön. Om kön är full väntar den tills kön har utrymme för att infoga ett element.
  • take()- Tar bort och returnerar ett element från blockeringskön. Om kön är tom kommer den att vänta tills kön har element som ska raderas.

Antag att vi vill infoga element i en kö. Om kön är full put()väntar metoden tills kön har utrymme för att infoga element.

På samma sätt om vi vill ta bort element från en kö. Om kön är tom take()väntar metoden tills kön innehåller element som ska raderas.

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

Produktion

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

För att lära dig mer om ArrayBlockingQueue, besök Java ArrayBlockingQueue.

Varför BlockingQueue?

I Java BlockingQueuebetraktas som den trådsäkra samlingen. Det beror på att det kan vara till hjälp vid operationer med flera trådar.

Antag att en tråd infogar element i kön och en annan tråd tar bort element från kön.

Nu, om den första tråden går långsammare, kan blockeringskön få den andra tråden att vänta tills den första tråden slutför sin verksamhet.

Intressanta artiklar...