Ú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:

  1. ajánlat() - Új elemet illeszt be a Sor
  2. közvélemény kutatás()- Eltávolít egy elemet a készülék elejéről Sor
  3. 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.