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
- Typy konštruktorov pre BlockingQueue v Jave
- Metódy v rozhraní BlockingQueue
- Implementácie BlockingQueue
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.
Toto 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:
- EduProducer
- EduConsumer
- 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.