Útmutató a Java Queue felülethez
1. Bemutatkozás
Ebben az oktatóanyagban a Java-kat tárgyaljuk Sor felület.
Először is vegyen egy kandikál milyen a Sor és néhány alapvető módszerét. Ezután számosba merülünk a Java által alapértelmezésként biztosított megvalósítások.
Végül beszélünk a menetbiztonságról, mielőtt az egészet becsomagolnánk.
2. A sor megjelenítése
Kezdjük egy gyors hasonlattal.
Képzelje el, hogy most nyitottuk meg első vállalkozásunkat - hot-dog standot. Új potenciális ügyfeleinket a lehető leghatékonyabban szeretnénk kiszolgálni kisvállalkozásaink számára; egyenként. Először arra kérjük őket, hogy egy rendezett vonalat alakítsanak ki a standunk előtt, új ügyfelekkel csatlakozva hátul. Szervezői képességeinknek köszönhetően ízletes hot dogjainkat korrekt módon oszthatjuk szét.
Sorok Java-ban hasonló módon dolgozzanak. Miután kijelentettük Várólista, új elemeket adhatunk hátulra, és elölről eltávolíthatjuk őket.
Valójában, a legtöbb Sorok itt találkozunk a Java munkájában módon - gyakran rövidítve: FIFO.
Van azonban egy kivétel, amelyet később érintünk.
3. Alapvető módszerek
A Sor számos olyan módszert deklarál, amelyet az összes implementációs osztálynak kódolnia kell. Vázoljunk néhányat a fontosabbak közülmost:
- ajánlat() - Új elemet illeszt be a Sor
- közvélemény kutatás()- Eltávolít egy elemet a készülék elejéről Sor
- kandikál() – Ellenőrzi az elemet a Várólista, eltávolítása nélkül
4. AbstractQueue
AbstractQueue az a a lehető legegyszerűbb Sor a Java által biztosított megvalósítás. Ez magában foglalja néhány csontváz megvalósítását Sor az interfész módszerei, kivéve ajánlat.
Amikor létrehozunk egy egyéni várólistát kiterjesztve a AbstractQueue osztály,biztosítanunk kell a megvalósításta ajánlat módszer ami igen nem engedélyezze a null elemek beillesztését.
Ezenkívül meg kell adnunk a módszereket kukucskál, szavazás, méret, és java.util’S iterátor.
Állítsunk össze egy egyszerűt Sor végrehajtás felhasználásával AbstractQueue.
Először határozzuk meg az osztályunkat a-val LinkedList tárolni a mi A várólista elemek:
public class CustomBaeldungQueue kiterjeszti az AbstractQueue {private LinkedList elemeket; public CustomBaeldungQueue () {this.elements = new LinkedList (); }}
Ezután menjünk felülírja a szükséges módszereket és megadja a kódot:
@Orride public Iterator iterator () {return elements.iterator (); } @Orride public int size () {return elements.size (); } @Orride public boolean offer (T t) {if (t == null) return false; elemek.add (t); return true; } @Orride public T poll () {Iterator iter = elements.iterator (); T t = iter.next (); if (t! = null) {iter.remove (); visszatér t; } return null; } @Orride public T peek () {return elements.getFirst (); }
Kiváló, ellenőrizzük, hogy működik-e egy gyors egység teszt:
customQueue.add (7); customQueue.add (5); int először = customQueue.poll (); int második = customQueue.poll (); assertEquals (7, első); assertEquals (5, második);
4. Alinterfészek
Általában a Sor felületet örökli 3 fő alinterfész. Sorok blokkolása, Sorok átvitele, és Deques.
Ezt a 3 interfészt együttesen a Java elérhető túlnyomó többsége valósítja meg Sorok. Vessünk egy gyors pillantást arra, hogy ezeknek az interfészeknek mi a feladata.
4.1. A várólisták blokkolása
A BlockingQueue felület támogatja a további műveleteket, amelyek kényszerítik a szálakat a Soraz aktuális állapottól függően. Egy szál lehet várjon a Sor hogy ne legyen üres a visszakeresés megkísérlésekor, vagy hogy az üres legyen a hozzáadáskor egy új elem.
Alapértelmezett A várólisták blokkolása tartalmazza LinkedBlockingQueue, SynchronousQueue, és ArrayBlockingQueue.
További információért olvassa el cikkünket A várólisták blokkolása.
4.2. Transfer Queues
A TransferQueue interfész kiterjeszti a BlockingQueue interfész, de van a termelő-fogyasztó mintájára szabva. Ellenőrzi az információáramlást a termelőtől a fogyasztóig, ellennyomást keltve a rendszerben.
A Java az egyik megvalósítással szállít TransferQueue felület, LinkedTransferQueue.
4.3. Deques
Deque rövid a Dkettős-Ended Várakozásue és hasonlít egy kártyacsomaghoz - elemeket lehet venni a kártya elejétől és végétől egyaránt Deque. Hasonlóan a hagyományoshoz Várólista, a Deque metódusokat kínál a tetején és az alján tartott elemek hozzáadásához, letöltéséhez és bekukkantásához.
Részletes útmutató a Deque működik, nézze meg a mi ArrayDeque cikk.
5. Kiemelt várólisták
Korábban láttuk, hogy a legtöbb Sorok hogy a Java-ban találkozunk a FIFO elvét követve.
Az egyik ilyen kivétel ez alól a szabály alól a PriorityQueue. Ha új elemeket illeszt be a Kiemelten fontosVárólista, természetes sorrendjük alapján rendezik, vagy egy meghatározott Összehasonlító a szerkesztéskor biztosított Kiemelten fontosSor.
Vizsgáljuk meg, hogyan működik ez egy egyszerű egységteszt segítségével:
PriorityQueue integerQueue = új PriorityQueue (); integerQueue.add (9); integerQueue.add (2); integerQueue.add (4); int első = integerQueue.poll (); int másodperc = integerQueue.poll (); int harmadik = integerQueue.poll (); assertEquals (2, első); assertEquals (4, második); assertEquals (9., harmadik);
Annak ellenére, hogy milyen sorrendben adtuk hozzá egész számainkat a Kiemelten fontosSor, ezt láthatjuk a visszakeresési sorrend a számok természetes sorrendjének megfelelően változik.
Láthatjuk, hogy ugyanez igaz a alkalmazásra is Húrok:
PriorityQueue stringQueue = új PriorityQueue (); stringQueue.add ("áfonya"); stringQueue.add ("alma"); stringQueue.add ("cseresznye"); String first = stringQueue.poll (); String second = stringQueue.poll (); Harmadik karakterlánc = stringQueue.poll (); assertEquals ("alma", először); assertEquals ("áfonya", második); assertEquals ("cseresznye", harmadik);
6. Menetbiztonság
Elemek hozzáadása ehhez: Sorok különösen hasznos többszálas környezetben. A Sor szálak között megosztható, és felhasználható az előrehaladás blokkolására, amíg szabad hely nem áll rendelkezésre - segít nekünk legyőzni néhány gyakori több szálon átívelő problémát.
Például egyetlen lemezre történő írás több szálból erőforrás-versengést okoz, és lassú írási időket eredményezhet. Egyetlen író szál létrehozása a BlockingQueue enyhítheti ezt a problémát, és jelentősen jobb írási sebességhez vezethet.
Szerencsére a Java kínál ConcurrentLinkedQueue, ArrayBlockingQueue, és ConcurrentLinkedDeque amelyek szálbiztosak és tökéletesek a többszálas programokhoz.
7. Következtetés
Ebben az oktatóanyagban mélyen belemerültünk a Java-ba Sor felület.
Először mi feltárta, mi a Sor csinál, valamint a a Java által biztosított megvalósítások.
Ezután mi ránézett a Várólistaa szokásos FIFO-elv, valamint a PriorityQueue amely különbözik sorrendjében.
Végül mi felfedezte a menetbiztonságot és hogyan Sorok többszálas környezetben használható.
Mint mindig, a kód elérhető a GitHubon.