Co je BlockingQueue v Javě a jak ji implementovat?



Tento článek o BlockingQueue v Javě vám pomůže dozvědět se více o rozhraní BlockingQueue. Rovněž vám poskytne vhled do jeho metod a praktické implementace

je mezi programátory extrémně populární díky své komplexní řadě integrovaných funkcí. Většinou budete mít pro svůj problém vyhrazené řešení ještě předtím, než se objeví. Taková nesmírně užitečná a důležitá součást je rozhraní BlockingQueue v Javě. Prostřednictvím tohoto článku vrhnu trochu světla na BlockingQueue v Javě a na metody jeho implementace.

Níže jsou uvedena témata v tomto článku:





Rozhraní BlockingQueue v Javě

BlockingQueue v Javě je rozhraní, které bylo přidáno do prostředí Java 1.5 spolu s několika dalšími souběžnými třídami Utility, jako je ConcurrentHashMap, CopyOnWriteArrrayList atd. Rozhraní BlockingQueue patří k java.util.concurrent balík .Toto rozhraní vylepšuje řízení toku aktivací blokování v případě, že se vlákno pokouší vyřadit prázdnou frontu nebo zařadit celou frontu. V obou případech se toto rozhraní hodí.Jednoduše řečeno, předpokládejme, že a se pokouší přidat prvky do již plné fronty. V tomto bodě programu bude vyvolána BlockingQueue, která zablokuje dané vlákno, dokud jiné vlákno neuvolní frontu, aby uvolnilo místo. To může být výsledkem buď vyřazení prvku (prvků) vůle z celé fronty. Podobně bude vyvolána BlockingQueue k blokování vlákna, které se pokouší vyřadit již prázdnou frontu, dokud některé jiné vlákno nevloží nebo nepřidá prvek do prázdné fronta .

Při práci s rozhraním BlockingQueue v Javě si musíte pamatovat, že nepřijímá nulovou hodnotu. V případě, že se o to pokusíte, okamžitě vyvolá NullPointerException. Níže uvedený obrázek představuje fungování rozhraní BlockingQueue v Javě.



BlockingQueue - BlockingQueue v Javě - EdurekaTento rozhraní se používá hlavně mezi Producentem a spotřebitelem, protože je bezpečný pro vlákna.Myslím tím rozhraní BlockingQueue, které lze použít k vytvoření fronty, kterou může sdílet producent i spotřebitel

Abyste mohli pracovat s BlockingQueue v Javě, musíte se nejprve seznámit s jeho typy. Dovolte mi, abych vám je představil v další části tohoto článku.

Typy konstruktorů pro BlockingQueue v Javě

Pro rozhraní BlockingQueue v Javě existují dva typy konstruktorů:



kuchař vs loutka vs ansible
  • Neomezená fronta: U tohoto typu fronty bude kapacita nastavena na Integer.MAX_VALUE. Neomezená fronta nebude nikdy blokována, protože může dynamicky růst, pokaždé, když je do ní vložen prvek. Níže je uvedena syntaxe pro vytvoření neomezené fronty:
BlockingQueue bq = new LinkedBlockingDeque ()
  • Ohraničená fronta: U tohoto druhu fronty musíte předat kapacitu fronty v době jejího vytvoření, tj. Jako stavitel parametr. Jakmile je velikost přiřazena, nelze ji změnit. Níže je syntaxe pro vytvoření ohraničené fronty:
BlockingQueue bq = nový LinkedBlockingDeque (10)

Nyní, když jste obeznámeni se způsoby implementace BlockingQueue v Javě, dovolte mi uvést několik jejích metod.

Metody v rozhraní BlockingQueue

Metoda Popis
booleovský doplněk (E e) Tato metoda pomáhá při vkládání zadaného prvku do této fronty, pokud je ve frontě místo, jinak budehoditIllegalStateException
boolean obsahuje (Objekt o) Tato metoda vrací true, pokud fronta obsahuje zadaný prvek
int drainTo (kolekce c) Tato metoda odstraní všechny dostupné prvky z fronty a přidá je do určené kolekce
int drainTo (kolekce c, int maxElements) Tato metoda odstraní z fronty daný počet dostupných prvků a přidá je do zadaného
booleovská nabídka (E e) Tato metoda vloží zadaný prvek do fronty, pokud není plný a vrátí true, jinak vrátí false
booleovská nabídka (E e, long timeout, jednotka TimeUnit) Tato metoda vloží zadaný prvek do fronty. V případě, že je fronta plná, bude čekat až do zadané doby čekání, než bude prostor k dispozici.
E hlasování (dlouhý časový limit, jednotka TimeUnit) Tato metoda pomáhá při načítání a odstraňování záhlaví fronty. V případě, že je fronta prázdná, bude čekat až do zadané doby čekání na zpřístupnění prvku
void put (E e) Tato metoda vloží zadaný prvek do fronty čekáním na uvolnění místa v případě, že je fronta plná
int zbývající kapacita () Tato metoda pomáhá při vrácení počtu dalších prvků, které tato fronta může ideálně přijmout, aniž by byla blokována
boolean remove (Objekt o) Tato metoda odstraní jednu instanci zadaného prvku z fronty, pouze pokud je přítomen
E vzít () Tato metoda pomůže při načítání a odstraňování záhlaví fronty čekáním na zpřístupnění prvku v případě, že je fronta prázdná.

Implementace BlockingQueue

Zde budu implementovat jednoduchý příklad BlockingQueue v Javě, kdetřída EduProducer bude generovat data a vložit je do a fronta , současně další třída, EduConsumer odstraní data ze stejné fronty.

K tomu budu vytvářet 3 třídy, a to:

  1. EduProducer
  2. EduConsumer
  3. EdurekaHlavní

Nyní vytvořme každou z těchto tříd jednu po druhé.

EduProducer.java

balíček edureka import java.util.concurrent.BlockingQueue veřejná třída EduProducer implementuje Runnable {soukromá finální fronta BlockingQueue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } private void process () vrhá InterruptedException {// Vložte 10 ints do fronty pro (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 veřejná třída EduConsumer implementuje Runnable {soukromá finální fronta BlockingQueue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptedException e) {Thread.currentThread (). Interrupt ()}} soukromý void proces (Integer take) vyvolá InterruptedException {System.out.println ('[Spotřebitel] Odebrat:' + take) 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 veřejná třída EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer (queue) .start () new Thread (new EduConsumer (queue)). start ()}}

Jakmile dokončíte psaní kódu, spusťte program a získejte následující výstup:

[Výrobce] Přidat: 0 [Spotřebitel] Odběr: 0 [Výrobce] Zbývající kapacita fronty: 9 [Výrobce] Přidat: 1 [Výrobce] Zbývající kapacita fronty: 9 [Výrobce] Přidat: 2 [Výrobce] Zbývající kapacita fronty: 8 [Výrobce ] Přidat: 3 [Výrobce] Zbývající kapacita fronty: 7 [Spotřebitel] Vezměte: 1 [Výrobce] Přidat: 4 [Výrobce] Zbývající kapacita fronty: 7 [Výrobce] Přidat: 5 [Výrobce] Zbývající kapacita fronty: 6 [Výrobce] Přidat : 6 [Výrobce] Zbývající kapacita fronty: 5 [Spotřebitel] Take: 2 [Výrobce] Přidat: 7 [Výrobce] Zbývající kapacita fronty: 5 [Výrobce] Přidat: 8 [Výrobce] Zbývající kapacita fronty: 4 [Výrobce] Přidat: 9 [Producent] Zbývající kapacita fronty: 3 [Spotřebitel] Take: 3 [Spotřebitel] Take: 4 [Spotřebitel] Take: 5 [Consumer] Take: 6 [Consumer] Take: 7 [Consumer] Take: 8 [Consumer] Take: 9

Tím se dostáváme na konec tohoto článku o BlockingQueue v Javě. Pokud se chcete naučit Javu podrobněji, můžete se podívat na naši stránku také.

Nyní, když jste pochopili základy BlockingQueue v Javě, podívejte se na Edureka, důvěryhodná online vzdělávací společnost se sítí více než 250 000 spokojených studentů rozložených po celém světě. Kurz školení a certifikace Java J2EE a SOA společnosti Edureka je určen pro studenty a profesionály, kteří chtějí být vývojářem Java. Kurz je navržen tak, aby vám poskytl náskok v programování v jazyce Java a naučil vás základní i pokročilé koncepty Java spolu s různými rámci Java, jako je Hibernate & Spring.

Máte na nás dotaz? Uveďte to prosím v sekci komentářů v této „BlockingQueue v Javě“ a my se vám ozveme co nejdříve.