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ě
- Typy konstruktorů pro BlockingQueue v Javě
- Metody v rozhraní BlockingQueue
- Implementace BlockingQueue
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ě.
Tento 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:
- EduProducer
- EduConsumer
- 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.