I den här handledningen lär vi oss om Java BlockingQueue-gränssnittet och dess metoder.
Den BlockingQueue
gränssnittet för Java Collections
ram utökar Queue
grä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.BlockingQueue
paketet 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 ArrayBlockingQueue
och LinkedBlockingQueue
respektive. Dessa objekt kan använda BlockingQueue
grä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. Returnerarfalse
om kön är full.peek()
- Returnerar spärrköns huvud. Returnerarnull
om kön är tom.poll()
- Tar bort ett element från blockeringskön. Returnerarnull
om 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 100
millisekunder. 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
, microseconds
och nanoseconds
i offer()
och poll()
metoder.
Metoder som blockerar operationen
Det BlockingQueue
ger 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 BlockingQueue
betraktas 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.