Sprievodca rozhraním frontu Java

1. Úvod

V tomto výučbe budeme diskutovať o jazykoch Java Fronta rozhranie.

Najprv urobíme vziať a nakuknúť pri čom a Fronta a niektoré z jeho základných metód. Ďalej sa ponoríme do niekoľkých implementácie, ktoré Java poskytuje ako štandard.

Na záver si ešte povieme niečo o bezpečnosti nití, než to celé zabalíme.

2. Vizualizácia frontu

Začnime rýchlou analógiou.

Predstavte si, že sme práve otvorili náš prvý podnik - stánok s párkami v rožku. Chceme slúžiť našim novým potenciálnym zákazníkom čo najefektívnejším spôsobom pre náš malý podnik; jeden po druhom. Najskôr ich požiadame, aby pred našim stánkom vytvorili usporiadaný rad a vzadu sa pridali noví zákazníci. Vďaka našim organizačným schopnostiam môžeme teraz spravodlivo distribuovať naše chutné hot dogy.

Fronty v Jave fungujú podobným spôsobom. Potom, čo vyhlásime svoje Fronta, môžeme pridať nové prvky zozadu a odobrať ich spredu.

V skutočnosti, najviac Fronty stretneme sa s prácou Java v tomto prvom, prvom von spôsobom - často skrátene FIFO.

Existuje však jedna výnimka, ktorej sa dotkneme neskôr.

3. Základné metódy

The Fronta deklaruje niekoľko metód, ktoré musia byť kódované všetkými implementačnými triedami. Načrtnime niekoľko dôležitejšíchtie teraz:

  1. ponuka () - Vloží nový prvok na Fronta
  2. anketa ()- Odstráni prvok z prednej strany Fronta
  3. nahliadnuť () Skontroluje prvok v prednej časti Fronta, bez odstránenia

4. AbstractQueue

AbstractQueue je najjednoduchšie možné Fronta implementácia, ktorú poskytuje Java. Zahŕňa kostrovú implementáciu niektorých z Fronta metódy rozhrania, s výnimkou ponuka.

Keď vytvárame vlastný front predĺženie AbstractQueue trieda,musíme zabezpečiť implementáciuz ponuka metóda čo robí nie umožniť vloženie nulových prvkov.

Navyše, musíme poskytnúť metódy nahliadnuť, hlasovať, veľkosť, a java.util‘S iterátor.

Poďme dať dohromady jednoduchý Fronta implementácia použitím AbstractQueue.

Najskôr definujme našu triedu pomocou a LinkedList na uskladnenie nasej Fronty prvky:

verejná trieda CustomBaeldungQueue rozširuje AbstractQueue {súkromné ​​prvky LinkedList; public CustomBaeldungQueue () {this.elements = new LinkedList (); }}

Ďalej, poďme prepísať požadované metódy a poskytnúť kód:

@Override public Iterator iterator () {return elements.iterator (); } @Override public int size () {return elements.size (); } @Override public boolean offer (T t) {if (t == null) return false; elements.add (t); návrat pravdivý; } @Override public T poll () {Iterator iter = elements.iterator (); T t = iter.next (); if (t! = null) {iter.remove (); návrat t; } return null; } @Override public T peek () {return elements.getFirst (); }

Vynikajúce, skontrolujeme, či to funguje, pomocou rýchleho testu jednotky:

customQueue.add (7); customQueue.add (5); int first = customQueue.poll (); int second = customQueue.poll (); assertEquals (7, prvý); assertEquals (5, druhý);

4. Čiastkové rozhrania

Všeobecne platí, že Fronta rozhranie zdedil 3 hlavné čiastkové rozhrania. Blokovacie fronty, Transferové frontya Deques.

Spoločne sú tieto 3 rozhrania implementované prevažnou väčšinou dostupných jazykov Java Fronty. Poďme sa v krátkosti pozrieť na to, čo sú tieto rozhrania určené.

4.1. Blokovacie fronty

The BlockingQueue rozhranie podporuje ďalšie operácie, ktoré nútia vlákna čakať na server Frontapodľa aktuálneho stavu. Niť môže počkaj na Fronta aby nebol prázdny pri pokuse o načítanie, alebo aby zostal prázdny pri pridávaní nový prvok.

Štandardné Blokovacie fronty zahrnúť LinkedBlockingQueue, SynchronousQueue, a ArrayBlockingQueue.

Viac informácií nájdete v našom článku o Blokovacie fronty.

4.2. Prestupové rady

The TransferQueue rozhranie rozširuje BlockingQueue rozhranie ale je prispôsobené vzoru výrobca-spotrebiteľ. Riadi tok informácií od výrobcu k spotrebiteľovi a vytvára v systéme protitlak.

Java sa dodáva s jednou implementáciou TransferQueue rozhranie, LinkedTransferQueue.

4.3. Deques

Deque je skratka pre Dmazaný-Ended Queue a je obdobou balíka kariet - prvky je možné brať zo začiatku aj z konca karty Deque. Podobne ako tradičné Fronta, the Deque poskytuje metódy na pridávanie, načítanie a prehliadanie prvkov držaných v hornej aj dolnej časti.

Podrobný návod, ako Deque funguje, pozrite sa na naše ArrayDeque článok.

5. Prioritné rady

Už skôr sme videli, že väčšina z Fronty s ktorými sa v Jave stretávame, sa riadime princípom FIFO.

Jednou z takýchto výnimiek z tohto pravidla je PriorityQueue. Keď sa do prvku vložia nové prvky PrioritaFronta, sú zoradené na základe ich prirodzeného usporiadania alebo na základe definície Komparátor za predpokladu, že postavíme PrioritaFronta.

Pozrime sa, ako to funguje, pomocou jednoduchého testu jednotky:

PriorityQueue integerQueue = nová PriorityQueue (); integerQueue.add (9); integerQueue.add (2); integerQueue.add (4); int first = integerQueue.poll (); int sekunda = integerQueue.poll (); int tretí = integerQueue.poll (); assertEquals (2, prvé); assertEquals (4, druhý); assertEquals (9, tretí);

Napriek poradiu, v akom boli celé čísla pridané k PrioritaFronta, to môžeme vidieť poradie načítania sa mení podľa prirodzeného poradia čísel.

Vidíme, že to isté platí aj pri aplikácii na Struny:

PriorityQueue stringQueue = nová PriorityQueue (); stringQueue.add ("čučoriedka"); stringQueue.add ("jablko"); stringQueue.add ("čerešňa"); Prvý reťazec = stringQueue.poll (); Druhý reťazec = stringQueue.poll (); Reťazec tretí = stringQueue.poll (); assertEquals („jablko“, prvé); assertEquals („čučoriedka“, druhá); assertEquals ("čerešňa", tretia);

6. Bezpečnosť závitu

Pridávajú sa položky do Fronty je obzvlášť užitočný v prostrediach s viacerými vláknami. A Fronta môžu byť zdieľané medzi vláknami a môžu byť použité na blokovanie postupu, kým nebude k dispozícii miesto - pomáha nám prekonať niektoré bežné problémy s viacerými vláknami.

Napríklad zápis na jeden disk z viacerých vlákien vytvára spor o prostriedky a môže viesť k pomalým časom zápisu. Vytvorenie jedného vlákna spisovateľa pomocou a BlockingQueue môže zmierniť tento problém a viesť k výrazne zlepšeným rýchlostiam zápisu.

Našťastie Java ponúka ConcurrentLinkedQueue, ArrayBlockingQueuea ConcurrentLinkedDeque ktoré sú bezpečné pre vlákna a ideálne pre programy s viacerými vláknami.

7. Záver

V tomto tutoriáli sme sa hlboko ponorili do Javy Fronta rozhranie.

Po prvé, my preskúmali, čo a Fronta robí, ako aj implementácie, ktoré poskytuje Java.

Ďalej my pozrel na a Poradieobvyklý princíp FIFO, ako aj PriorityQueue ktorá sa líši svojim usporiadaním.

Nakoniec sme preskúmaná bezpečnosť nití a ako Fronty možno použiť v prostredí s viacerými vláknami.

Ako vždy, kód je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found