Mi a BlockingQueue a Java-ban, és hogyan lehet ezt megvalósítani?



Ez a cikk a Java BlockingQueue-ról segít megismerni a BlockingQueue felületet. Ezenkívül betekintést nyújt módszereibe és gyakorlati megvalósításába

rendkívül népszerű a programozók körében a beépített funkciók átfogó kínálata miatt. Legtöbbször dedikált megoldást talál a problémájára, még mielőtt megjelenik. Ilyen rendkívül hasznos és fontos része a Java BlockingQueue felülete. Ennek a cikknek a segítségével megvilágítom a BlockingQueue Java-t és a megvalósításának módszereit.

Az alábbiakban bemutatjuk a cikkben tárgyalt témákat:





BlockingQueue interfész a Java-ban

BlockingQueue a Java-ban egy olyan felület, amelyet a Java 1.5-be adtak hozzá néhány más egyidejű segédprogram-osztály mellett, például a ConcurrentHashMap, a CopyOnWriteArrrayList stb. A BlockingQueue felület a java.util.egyidejű csomag .Ez az interfész fokozza az áramlásszabályozást a blokkolás aktiválásával, abban az esetben, ha egy szál üres sort kíván eltávolítani, vagy teljes sort állít fel. Mindkét esetben ez a felület jól jön.Tegyük fel egyszerűbben: a elemeket próbál felvenni egy már teljes sorba. A program ezen a pontján a BlockingQueue kerül meghívásra, amely blokkolja az adott szálat, amíg egy másik szál el nem engedi a várólistát, hogy helyet teremtsen. Ez annak a következménye lehet, hogy a teljes várólistán levő elem (ek) bármelyikét eltávolítják. Hasonlóképpen, a BlockingQueue lesz meghívva, hogy blokkoljon egy szálat, amellyel megpróbálják megszüntetni a már üres sort, amíg más szál be nem illeszti vagy hozzá nem ad egy elemet az üresen sor .

A Java-ban a BlockingQueue felület használatakor emlékeznie kell arra, hogy az nem fogad el null értéket. Abban az esetben, ha megpróbálja ezt megtenni, akkor azonnal dob egy NullPointerException-t. Az alábbi ábra a Java BlockingQueue felületének működését mutatja be.



BlockingQueue - BlockingQueue Java-ban - EdurekaEz felület főleg a termelő-fogyasztók között használják, mivel szálbiztos.Úgy értem, hogy a BlockingQueue felület használható egy sor létrehozására, amelyet a gyártó és a fogyasztó egyaránt megoszthat

Ahhoz, hogy a Java-ban működjön a BlockingQueue, először meg kell ismernie annak típusait. Hadd mutassam be nekik a cikk következő szakaszában.

adattípusok a mysql-ben példákkal

A Java BlockingQueue kivitelezőinek típusai

Kétféle konstruktor létezik a BlockingQueue felülethez a Java-ban:



  • Korlátlan sor: Ennél a sornál a kapacitás értéke Integer.MAX_VALUE. A kötetlen várólista soha nem lesz blokkolva, mivel dinamikusan növekedhet, minden egyes elem beillesztésekor. Az alábbiakban látható a szintaxis egy korlátlan sor létrehozásához:
BlockingQueue bq = new LinkedBlockingDeque ()
  • Korlátozott sor: Ehhez a fajta sorhoz át kell adni a sor kapacitását annak létrehozásakor, azaz mint építész paraméter. A méret kijelölése után nem módosítható. Az alábbiakban látható a szintaxis egy korlátozott sor létrehozásához:
BlockingQueue bq = new LinkedBlockingDeque (10)

Most, hogy ismeri a BlockingQueue Java alkalmazásának módjait, hadd soroljak fel néhány módszert.

Módszerek a BlockingQueue felületen

Módszer Leírás
logikai hozzáadás (E e) Ez a módszer segít beilleszteni a megadott elemet ebbe a sorba, ha van hely a várólistábandobj egyIllegalStateException
logikai érték tartalmazza (o objektum) Ez a módszer igaz értéket ad vissza, ha a sor a megadott elemet tartalmazza
int drainTo (c gyűjtemény) Ez a módszer eltávolítja az összes rendelkezésre álló elemet a sorból, és hozzáadja a megadott gyűjteményhez
int drainTo (c gyűjtemény, int maxElements) Ez a módszer a megadott számú rendelkezésre álló elemet eltávolítja a sorból, és hozzáadja őket a megadotthoz
logikai ajánlat (E e) Ez a módszer beilleszti a megadott elemet a sorba, ha az nem teljes, és true értéket ad vissza, különben hamis értéket ad vissza
logikai ajánlat (E e, hosszú időtúllépés, TimeUnit egység) Ez a módszer beilleszti a megadott elemet a sorba. Ha a sor megtelt, akkor a megadott várakozási időig vár, amíg a hely rendelkezésre áll.
E szavazás (hosszú időtúllépés, TimeUnit egység) Ez a módszer segít a sor fejének lekérésében és eltávolításában. Ha a sor üres, akkor a megadott várakozási időig vár, amíg egy elem elérhetővé válik
érvénytelen put (E e) Ez a módszer beilleszti a megadott elemet a várólistába, megvárva, amíg szabad hely lesz, n ha a sor megtelik
int hátralévő kapacitás () Ez a módszer segít a további elemek számának visszaküldésében, amelyeket ez a sor ideálisan elfogad, blokkolás nélkül
logikai eltávolítás (o objektum) Ez a módszer csak akkor távolítja el a megadott elem egyetlen példányát a sorból, ha jelen van
E take () Ez a módszer segítséget nyújt a sor fejének lekérésében és eltávolításában azáltal, hogy megvárja, amíg egy elem elérhetővé válik, ha a sor üres.

BlockingQueue implementációk

Itt egy egyszerű példát fogok megvalósítani a BlockingQueue Java-banosztályú EduProducer generálja az adatokat, és beilleszti azokat a sor , egyidejűleg egy másik osztály, az EduConsumer eltávolítja az adatokat ugyanabból a sorból.

hogyan kell használni a szkenner osztályt

Ehhez 3 osztályt fogok létrehozni, nevezetesen:

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

Most hozzuk létre ezeket az osztályokat egyenként.

EduProducer.java

csomag edureka import java.util.concurrent.BlockingQueue nyilvános osztály EduProducer futtatja a {futtatható {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). megszakítani ()} } private void process () dobja az InterruptedException {// betesz 10 int a várólistába (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

csomag edureka import java.util.concurrent.BlockingQueue nyilvános osztály Az EduConsumer végrehajtja a Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread () .rupt ()}} private void process (Integer take) dobja az InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} public EduConsumer (BlockingQueue queue) {this.queue = queue}}

EdurekaMain.java

csomag edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue public class EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer (que) .start () new Thread (új EduConsumer (sor)). start ()}}

Miután befejezte a kód megírását, futtassa a programot az alábbi kimenet megszerzéséhez:

tizedestől binárisig a pythonban
[Producer] Hozzáadás: 0 [Consumer] Take: 0 [Producer] Queue fennmaradó kapacitása: 9 [Producer] Hozzáadás: 1 [Producer] Queue fennmaradó kapacitása: 9 [Producer] Hozzáadás: 2 [Producer] Queue fennmaradó kapacitása: 8 [Producer ] Hozzáadás: 3 [Producer] Queue fennmaradó kapacitása: 7 [Consumer] Take: 1 [Producer] Hozzáadás: 4 [Producer] Queue fennmaradó kapacitása: 7 [Producer] Hozzáadás: 5 [Producer] Queue fennmaradó kapacitása: 6 [Producer] Hozzáadás : 6 [Producer] Queue fennmaradó kapacitása: 5 [Consumer] Take: 2 [Producer] Hozzáadás: 7 [Producer] Queue fennmaradó kapacitása: 5 [Producer] Hozzáadás: 8 [Producer] Queue fennmaradó kapacitása: 4 [Producer] Hozzáadás: 9 [Producer] Queue fennmaradó kapacitása: 3 [Consumer] Take: 3 [Consumer] Take: 4 [Consumer] Take: 5 [Consumer] Take: 6 [Consumer] Take: 7 [Consumer] Take: 8 [Consumer] Take: 9

Ezzel elérkeztünk a Java BlockingQueue című cikkéhez. Ha részletesebben szeretné megtanulni a Java-t, akkor tekintse meg a mi oldalunkat is.

Most, hogy megértette a Java BlockingQueue alapjait, nézze meg a az Edureka, egy megbízható online tanulási vállalat, amelynek több mint 250 000 elégedett tanulóval rendelkező hálózata elterjedt az egész világon. Az Edureka Java J2EE és SOA Training and Certification tanfolyamát olyan hallgatók és szakemberek számára tervezték, akik Java fejlesztők szeretnének lenni. A tanfolyamot úgy tervezték, hogy előrelépést nyújtson a Java programozásban, és képezze mind az alapvető, mind a fejlett Java koncepciókhoz, valamint a különböző Java keretrendszerekhez, például a Hibernate & Spring.

Van egy kérdésünk? Kérjük, említse meg a „BlockingQueue in Java” megjegyzés rovatában, és a lehető leghamarabb kapcsolatba lépünk Önnel.