Ebben az oktatóanyagban megismerhetjük a Java BlockingQueue felületet és annak módszereit.
A BlockingQueue
Java Collections
keretrendszer Queue
interfésze kiterjeszti az interfészt. Lehetővé teszi bármely művelet kivárását, amíg sikeresen elvégezhető.
Például, ha törölni akarunk egy elemet egy üres sorból, akkor a blokkoló várakozási sor lehetővé teszi a törlési művelet megvárását, amíg a sor tartalmaz néhány törölendő elemet.
Osztályok, amelyek megvalósítják a BlockingQueue-t
Mivel BlockingQueue
ez egy interfész, nem tudjuk biztosítani annak közvetlen megvalósítását.
A funkcionalitás BlockingQueue
használatához olyan osztályokat kell használnunk, amelyek megvalósítják azt.
- ArrayBlockingQueue
- LinkedBlockingQueue
Hogyan kell használni a blokkoló várólistákat?
A java.util.concurrent.BlockingQueue
használat érdekében be kell importálnunk a csomagot BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Itt hoztunk létre objektumokat animal1 és animal2 osztályok ArrayBlockingQueue
és LinkedBlockingQueue
rendre. Ezek az objektumok felhasználhatják az BlockingQueue
interfész funkcióit .
A BlockingQueue módszerei
Annak alapján, hogy egy sor teljes vagy üres, a blokkoló várakozási módszerek 3 kategóriába sorolhatók:
Kivételt elvető módszerek
add()
- Beszúr egy elemet a blokkoló sorba a sor végén. Kivételt dob, ha a sor tele van.element()
- Visszaadja a blokkoló sor fejét. Kivételt dob, ha a sor üres.remove()
- Eltávolít egy elemet a blokkoló sorból. Kivételt dob, ha a sor üres.
Olyan módszerek, amelyek valamilyen értéket adnak vissza
offer()
- Beszúrja a megadott elemet a sor végén lévő blokkoló sorba. Visszatér,false
ha a sor tele van.peek()
- Visszaadja a blokkoló sor fejét. Visszatér,null
ha a sor üres.poll()
- Eltávolít egy elemet a blokkoló sorból. Visszatér,null
ha a sor üres.
További ajánlat () és közvélemény-kutatás ()
A offer()
és a poll()
módszer használható időkorlátokkal. Vagyis paraméterként átadhatjuk az időegységeket. Például,
offer(value, 100, milliseconds)
Itt,
- Az érték a sorba beillesztendő elem
- És beállítottunk egy 100 milliszekundumos időtúllépést
Ez azt jelenti, hogy a offer()
módszer megpróbál betenni egy elemet a blokkoló sorba 100
milliszekundumig. Ha az elemet nem lehet 100 milliszekundum alatt beilleszteni, a módszer visszatér false
.
Megjegyzés: Ahelyett, hogy milliseconds
azt is használja ezeket ideje alatt: days
, hours
, minutes
, seconds
, microseconds
és nanoseconds
a offer()
és poll()
módszereket.
A műveletet blokkoló módszerek
Az BlockingQueue
eljárásokat is biztosít, hogy blokkolja a műveleteket, és várja, ha a sor megtelt, vagy üres.
put()
- Beszúr egy elemet a blokkoló sorba. Ha a sor tele van, akkor megvárja, amíg a sornak van helye egy elem beszúrására.take()
- Eltávolít és visszaad egy elemet a blokkoló sorból. Ha a sor üres, akkor megvárja, amíg a sorban törölni kell az elemeket.
Tegyük fel, hogy elemeket szeretnénk beszúrni egy sorba. Ha a várólista megtelt, akkor a put()
módszer megvárja, amíg a sornak van helye az elemek beszúrására.
Hasonlóképpen, ha elemeket akarunk törölni a sorból. Ha a sor üres, akkor a take()
módszer megvárja, amíg a sor törlendő elemeket tartalmaz.
A BlockingQueue megvalósítása az ArrayBlockingQueue-ban
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(); ) ) )
Kimenet
BlockingQueue: (2, 1, 3) Eltávolított elem: 2
További információért ArrayBlockingQueue
látogasson el a Java ArrayBlockingQueue oldalra.
Miért éppen a BlockingQueue?
A Java -ban szálbiztos gyűjteménynek BlockingQueue
számít . Ugyanis hasznos lehet a többszálas műveleteknél.
Tegyük fel, hogy az egyik szál elemeket illeszt be a sorba, egy másik szál pedig eltávolítja az elemeket a sorból.
Ha az első szál lassabban fut, akkor a blokkolási sor a második szálat megvárhatja, amíg az első szál befejezi a működését.