Mis on Java'is BlockingQueue ja kuidas seda rakendada?

See artikkel Java BlockingQueue kohta aitab teil õppida BlockingQueue liidest. See annab teile ka ülevaate selle meetoditest ja praktilisest rakendamisest

on programmeerijate seas ülipopulaarne tänu oma ulatuslikule sisseehitatud funktsioonide valikule. Enamasti on teil oma probleemile spetsiaalne lahendus juba enne selle ilmumist. Selline ülimalt kasulik ja oluline osa on Java-liides BlockingQueue. Selle artikli vahendusel heidan pisut valgust Java BlockingQueue'ile ja selle rakendamise meetoditele.

Allpool on siin artiklis käsitletud teemad:





BlockingQueue liides Java-s

BlockingQueue Java-s on liides, mis lisati Java 1.5-sse koos mõne teise samaaegse utiliidiklassiga, nagu ConcurrentHashMap, CopyOnWriteArrrayList jne. Liides BlockingQueue kuulub java.util.jooksev pakend .See liides suurendab voo juhtimist, aktiveerides blokeerimise, juhul kui lõim üritab tühja järjekorda tühistada või tervet järjekorda. Mõlemal juhul on see liides kasulik.Oletame lihtsamalt öeldes a üritab elemente lisada juba täisjärjekorda. Programmi selles punktis käivitatakse BlockingQueue, mis blokeerib selle konkreetse lõime, kuni mõni teine ​​lõim vabastab järjekorra ruumi vabastamiseks. See võib olla tingitud kogu järjekorra vaba ruumi elemendi (de) eemaldamisest. Samamoodi kutsutakse BlockingQueue'i, et blokeerida niit juba tühja järjekorra eemaldamiseks, kuni mõni teine ​​lõim lisab tühja tühja või lisab selle elemendi järjekorda .

Java-liidesega BlockingQueue töötades peate meeles pidama, et see ei aktsepteeri nullväärtust. Juhul, kui proovite seda teha, viskab see koheselt NullPointerExceptioni. Allpool olev joonis näitab Java-liidese BlockingQueue tööd.



BlockingQueue - BlockingQueue Java-s - EdurekaSeda liides kasutatakse peamiselt tootjate ja tarbijate vahel, kuna see on niidisõbralik.Pean silmas, et liidest BlockingQueue saab kasutada nii tootja kui ka tarbija jagatava järjekorra loomiseks

Java-s BlockingQueue'iga töötamiseks peate kõigepealt tundma selle tüüpe. Lubage mul tutvustada teile neid selle artikli järgmises jaotises.

Java Java BlockingQueue'i konstruktorite tüübid

Javas on BlockingQueue liidese jaoks kahte tüüpi konstruktoreid:



  • Piiramatu järjekord: Seda tüüpi järjekorra jaoks seatakse maht täisarvuks.MAX_VALUE. Piiramatu järjekord ei blokeeru kunagi, kuna see võib dünaamiliselt kasvada, iga kord, kui element sinna sisestatakse. Allpool on süntaks piiramatu järjekorra loomiseks:
BlockingQueue bq = new LinkedBlockingDeque ()
  • Piiratud järjekord: Sellise järjekorra jaoks peate läbima järjekorra läbilaskevõime selle loomise ajal, st kui ehitaja parameeter. Kui suurus on määratud, ei saa seda enam muuta. Allpool on süntaks piiratud järjekorra loomiseks:
BlockingQueue bq = uus LinkedBlockingDeque (10)

Nüüd, kui olete BlockingQueue Java-rakendamise viisidega tuttav, lubage mul loetleda mõned selle meetodid.

mis on Java-s muutumatu objekt

Meetodid BlockingQueue liideses

Meetod Kirjeldus
boolean lisamine (E e) See meetod aitab määratud elemendi sellesse järjekorda sisestada, kui järjekorras on veel ruumiviska anIllegalStateException
tõeväärtus sisaldab (Object o) See meetod tagastab tõene, kui järjekord sisaldab määratud elementi
int drainTo (kogu c) See meetod eemaldab kõik saadaolevad elemendid järjekorrast ja lisab need määratud kogusse
int drainTo (kogu c, int maxElement) See meetod eemaldab järjekorrast antud arvul saadaolevaid elemente ja lisab need määratud elementidesse
booloean pakkumine (E e) See meetod sisestab määratud elemendi järjekorda, kui see pole täis ja tagastab tõene, muidu tagastab vale
boolean-pakkumine (E e, pikk ajalõpp, TimeUniti ühik) See meetod sisestab määratud elemendi järjekorda. Juhul, kui järjekord on täis, ootab see ruumi vabanemiseks määratud ooteaega.
E küsitlus (pikk ajalõpp, TimeUniti ühik) See meetod aitab järjekorra pea välja otsida ja eemaldada. Kui järjekord on tühi, ootab see kuni määratud ooteajani, kuni element saab kättesaadavaks
tühine pane (E e) See meetod sisestab määratud elemendi järjekorda, oodates ruumi vabanemist n juhul, kui järjekord on täis
int järelejäänud mahtuvus () See meetod aitab tagastada arv täiendavaid elemente, mille see järjekord võib ideaalselt vastu võtta ilma blokeerimata
tõeväärtuse eemaldamine (objekt o) See meetod eemaldab järjekorrast määratud elemendi ühe eksemplari ainult siis, kui see on olemas
E võtta () See meetod aitab järjekorra pea välja otsida ja eemaldada, oodates elemendi kättesaadavaks tegemist, juhul kui järjekord on tühi.

Blokeerimisjärjekorra rakendused

Siin rakendan lihtsa näite BlockingQueue Java-sklassi EduProducer genereerib andmed ja sisestab need a järjekorda , samaaegselt teine ​​klass, eemaldab EduConsumer andmed samast järjekorrast.

Selle jaoks loodan 3 klassi, nimelt:

  1. EduTootja
  2. EduTarbija
  3. EdurekaMain

Loome nüüd kõik need klassid ükshaaval.

EduProducer.java

pakett edureka import java.util.concurrent.BlockingQueue avalik klass EduProducer rakendab Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). break ()} } private void process () viskab InterruptedException {// paneb 10 inti järjekorda (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

pakett edureka import java.util.concurrent.BlockingQueue avalik klass EduConsumer rakendab 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 protsess (täisarvu võtmine) viskab InterruptedException {System.out.println ('[[Consumer] Remove:' + take) Thread.sleep (500)} public EduTarbija (BlockingQueue järjekord) {this.queue = queue}}

EdurekaMain.java

java vaikeväärtus stringile
pakett edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue avalik klass EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer (que) .start () new Thread (uus EduConsumer (järjekord)). start ()}}

Kui olete koodi kirjutanud, käivitage programm, et saada järgmine väljund:

[Tootja] Lisa: 0 [Tarbija] Võta: 0 [Tootja] Järjekorra järelejäänud maht: 9 [Tootja] Lisage: 1 [Tootja] Järjekorra järelejäänud maht: 9 [Tootja] Lisage: 2 [Tootja] Järjekorra järelejäänud maht: 8 [Tootja ] Lisage: 3 [Tootja] Järjekorra järelejäänud maht: 7 [Tarbija] Võtke: 1 [Tootja] Lisage: 4 [Tootja] Järjekorra järelejäänud maht: 7 [Tootja] Lisage: 5 [Tootja] Järjekorra järelejäänud maht: 6 [Tootja] Lisa : 6 [Tootja] Järjekorra järelejäänud maht: 5 [Tarbija] Võta: 2 [Tootja] Lisa: 7 [Tootja] Järjekorra järelejäänud maht: 5 [Tootja] Lisa: 8 [Tootja] Järjekorra järelejäänud maht: 4 [Tootja] Lisa: 9 [Tootja] Järjekorra järelejäänud maht: 3 [Tarbija] Võta: 3 [Tarbija] Võta: 4 [Tarbija] Võta: 5 [Tarbija] Võta: 6 [Tarbija] Võta: 7 [Tarbija] Võta: 8 [Tarbija] Võta: 9

Sellega jõuame Java-i BlockingQueue'i artikli lõpuni. Kui soovite Java-d üksikasjalikumalt õppida, võite pöörduda meie poole samuti.

Nüüd, kui olete Java põhitõed BlockingQueue'ist aru saanud, vaadake järgmist autor Edureka, usaldusväärne veebiõppeettevõte, mille võrgustik koosneb enam kui 250 000 rahulolevast õppijast ja mis levib üle kogu maailma. Edureka Java J2EE ning SOA koolitus- ja sertifitseerimiskursus on mõeldud õpilastele ja spetsialistidele, kes soovivad olla Java arendajad. Kursus on loodud selleks, et anda teile Java Programmeerimises edukas algus ja õpetada teid nii Java-põhiprogrammide kui ka edasijõudnute mõistete ning erinevate Java-raamistike, näiteks talveunerežiimi ja kevade jaoks.

Kas teil on meile küsimus? Palun mainige seda selle „BlockingQueue in Java“ kommentaaride osas ja võtame teiega ühendust niipea kui võimalik.