Čo je BlockingQueue v Jave a ako ju implementovať?



Tento článok o BlockingQueue v Jave vám pomôže dozvedieť sa viac o rozhraní BlockingQueue. Poskytne vám tiež informácie o jeho metódach a praktickej implementácii

je medzi programátormi mimoriadne obľúbený kvôli svojej komplexnej škále vstavaných funkcií. Väčšinou budete mať k dispozícii špeciálne riešenie vášho problému ešte skôr, ako sa objaví. Takáto mimoriadne užitočná a dôležitá súčasť je rozhranie BlockingQueue v Jave. Prostredníctvom tohto článku vrhnem trochu svetla na BlockingQueue v Jave a na spôsoby jej implementácie.

Ďalej sú uvedené témy, ktorým sa tento článok venuje:





Rozhranie BlockingQueue v Jave

BlockingQueue v Jave je rozhranie, ktoré bolo pridané do Java 1.5 spolu s niekoľkými ďalšími súbežnými triedami Utility, ako sú ConcurrentHashMap, CopyOnWriteArrrayList, atď. Rozhranie BlockingQueue patrí k java.util.concurrent balíček .Toto rozhranie vylepšuje riadenie toku aktiváciou blokovania v prípade, že sa vlákno pokúša vyradiť z frontu prázdny rad alebo zaradiť celý rad do fronty. V obidvoch prípadoch sa toto rozhranie hodí.Jednoduchšie povedané, predpokladajme a sa pokúša pridať prvky do už plnej fronty. V tomto bode programu sa vyvolá BlockingQueue, ktorá zablokuje dané vlákno, kým iné vlákno neuvoľní rad, aby uvoľnilo miesto. Môže to byť výsledkom buď vyradenia prvku (prvkov) z voľného priestoru celého frontu. Podobne sa vyvolá BlockingQueue na blokovanie vlákna, ktoré sa pokúša vyradiť z už prázdneho frontu, kým iné vlákno nevloží alebo nepridá prvok do prázdneho frontu. poradie .

Pri práci s rozhraním BlockingQueue v Jave si musíte uvedomiť, že neprijíma nulovú hodnotu. V prípade, že sa o to pokúsite, okamžite vyvolá NullPointerException. Nasledujúci obrázok predstavuje fungovanie rozhrania BlockingQueue v prostredí Java.



BlockingQueue - BlockingQueue v Jave - EdurekaToto rozhranie sa používa hlavne medzi výrobcami a spotrebiteľmi, pretože je bezpečný pre vlákna.Mám na mysli to, že rozhranie BlockingQueue sa dá použiť na vytvorenie frontu, ktorý môže zdieľať producent aj spotrebiteľ

Aby ste mohli pracovať s BlockingQueue v Jave, musíte sa najskôr oboznámiť s jeho typmi. Dovoľte mi, aby som vám ich predstavil v ďalšej časti tohto článku.

Typy konštruktorov pre BlockingQueue v Jave

Pre rozhranie BlockingQueue v Jave existujú dva typy konštruktorov:



čo je inštancia v Jave
  • Neohraničený front: Pre tento typ frontu bude kapacita nastavená na Integer.MAX_VALUE. Neohraničený rad sa nikdy nezabloká, pretože môže dynamicky rásť, zakaždým, keď je doň vložený prvok. Nižšie je uvedená syntax na vytvorenie nespútaného frontu:
BlockingQueue bq = nový LinkedBlockingDeque ()
  • Ohraničený rad: Pre tento druh frontu musíte odovzdať kapacitu frontu v čase jeho vytvorenia, t.j. ako a staviteľ parameter. Po priradení veľkosti ju nie je možné zmeniť. Nižšie je uvedená syntax na vytvorenie obmedzeného frontu:
BlockingQueue bq = nový LinkedBlockingDeque (10)

Teraz, keď už poznáte spôsoby implementácie BlockingQueue v Jave, dovoľte mi uviesť niekoľko jeho metód.

Metódy v rozhraní BlockingQueue

Metóda Popis
boolovský prírastok (E e) Táto metóda pomáha pri vkladaní zadaného prvku do tohto frontu, ak je vo fronte miesto, inak budehodiťIllegalStateException
boolean obsahuje (Objekt o) Táto metóda vráti hodnotu true, ak front obsahuje zadaný prvok
int drainTo (kolekcia c) Táto metóda odstráni všetky dostupné prvky z frontu a pridá ich do určenej kolekcie
int drainTo (kolekcia c, int maxElements) Táto metóda odstráni z frontu daný počet dostupných prvkov a pridá ich do zadaného
boolovská ponuka (E e) Táto metóda vloží zadaný prvok do frontu, ak nie je plný, a vráti hodnotu true, inak vráti hodnotu false
boolovská ponuka (E e, dlhý časový limit, jednotka TimeUnit) Táto metóda vloží zadaný prvok do poradia. V prípade, že je fronta plná, bude čakať až do zadaného času čakania na sprístupnenie priestoru.
E hlasovanie (dlhý časový limit, jednotka TimeUnit) Táto metóda pomáha pri načítaní a odstránení hlavy frontu. V prípade, že je rad prázdny, bude čakať až do zadaného času čakania na sprístupnenie prvku
void put (E e) Táto metóda vloží zadaný prvok do frontu čakaním na sprístupnenie priestoru v prípade, že je front plný
int zostávajúca kapacita () Táto metóda pomáha vrátiť počet ďalších prvkov, ktoré tento front môže v ideálnom prípade prijať bez blokovania
boolean remove (Objekt o) Táto metóda odstráni jednu inštanciu zadaného prvku z frontu, iba ak je prítomný
E vziať () Táto metóda pomôže pri načítaní a odstránení hlavy frontu čakaním na sprístupnenie prvku v prípade, že je front prázdny.

Implementácie BlockingQueue

Tu budem implementovať jednoduchý príklad BlockingQueue v Jave, kdetrieda EduProducer bude generovať dáta a vložiť ich do a poradie , súčasne iná trieda, EduConsumer odstráni údaje z tej istej fronty.

Z tohto dôvodu budem vytvárať 3 triedy, a to:

  1. EduProducer
  2. EduConsumer
  3. EdurekaHlavná

Poďme teraz vytvoriť každú z týchto tried jednu po druhej.

EduProducer.java

balíček edureka import java.util.concurrent.BlockingQueue verejná trieda EduProducer implementuje Runnable {private final BlockingQueue front @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } private void process () vrhá InterruptedException {// Dajte do frontu 10 palcov pre (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

balíček edureka import java.util.concurrent.BlockingQueue verejná trieda EduConsumer implementuje Runnable {private final BlockingQueue fronta @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Interrupt ()}} proces súkromných void (Integer take) vyvolá InterruptedException {System.out.println ('[Zákazník] Odstrániť:' + vziať) Thread.sleep (500)} public EduConsumer (fronta BlockingQueue) {this.queue = fronta}}

EdurekaMain.java

balíček edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue verejná trieda EdurekaMain {public static void main (String [] args) {BlockingQueue queue = nový LinkedBlockingQueue (10) nové vlákno (nový EduProducer (front)) .start () nové vlákno (nový EduConsumer (front)). start ()}}

Akonáhle skončíte s písaním kódu, spustite program, aby ste získali nasledujúci výstup:

[Producent] Pridať: 0 [Spotrebiteľ] Obsadenie: 0 [Producent] Zostávajúca kapacita fronty: 9 [Producent] Pridať: 1 [Producent] Zostávajúca kapacita fronty: 9 [Producent] Pridať: 2 [Producent] Zostávajúca kapacita fronty: 8 [Producent ] Vložiť: 3 [Producent] Zostávajúca kapacita fronty: 7 [Zákazník] Odber: 1 [Producent] Vložiť: 4 [Producent] Zostávajúca kapacita fronty: 7 [Producent] Pridať: 5 [Producent] Zostávajúca kapacita fronty: 6 [Producent] Pridať : 6 [Producent] Zostávajúca kapacita fronty: 5 [Spotrebiteľ] Obsadenie: 2 [Producent] Pridať: 7 [Producent] Zostávajúca kapacita fronty: 5 [Producent] Pridať: 8 [Producent] Zostávajúca kapacita fronty: 4 [Producent] Pridať: 9 [Producent] Zostávajúca kapacita frontu: 3 [Zákazník] Vezmite: 3 [Zákazník] Vezmite: 4 [Spotrebiteľ] Vezmite: 5 [Zákazník] Vezmite: 6 [Spotrebiteľ] Vezmite: 7 [Spotrebiteľ] Vezmite: 8 [Spotrebiteľ] Vezmite: 9

Týmto sa dostávame na koniec tohto článku o BlockingQueue v Jave. Ak sa chcete dozvedieť jazyk Java podrobnejšie, môžete sa obrátiť na našu stránku tiež.

Teraz, keď ste pochopili základy BlockingQueue v Jave, pozrite sa na autor: Edureka, dôveryhodná online vzdelávacia spoločnosť so sieťou viac ako 250 000 spokojných študentov rozmiestnených po celom svete. Kurz odbornej prípravy a certifikácie Java J2EE a SOA spoločnosti Edureka je určený pre študentov a profesionálov, ktorí chcú byť vývojármi v prostredí Java. Kurz je navrhnutý tak, aby vám dal úvod do programovania v jazyku Java a naučil vás základné aj pokročilé koncepty Java spolu s rôznymi rámcami Java, ako je Hibernate & Spring.

Máte na nás otázku? Prosím, uveďte to v sekcii komentárov v tejto „BlockingQueue v Jave“ a my sa vám ozveme čo najskôr.