Útmutató a Java PriorityBlockingQueue programhoz

1. Bemutatkozás

Ebben a cikkben a következőkre fogunk összpontosítani PriorityBlockingQueue osztályban, és nézzen át néhány gyakorlati példát.

Kezdve azzal a feltevéssel, hogy már tudjuk, mi a Sor vagyis először bemutatjuk hogyan elemei a PriorityBlockingQueue prioritás szerint rendezik.

Ezt követően bemutatjuk, hogy az ilyen típusú várólista miként használható egy szál blokkolására.

Végül megmutatjuk, hogy e két funkció együttes használata hogyan lehet hasznos, ha több szálon keresztül dolgozzuk fel az adatokat.

2. Az elemek prioritása

A szokásos várólistával ellentétben nem adhat hozzá bármilyen típusú elemet az a-hoz PriorityBlockingQueue. Két lehetőség van:

  1. Megvalósító elemek hozzáadása Hasonló
  2. Olyan elemek hozzáadása, amelyek nem valósulnak meg Hasonló, azzal a feltétellel, hogy megadja a Összehasonlító is

Bármelyik Összehasonlító vagy a Hasonló megvalósítások az elemek összehasonlítására, az PriorityBlockingQueue mindig rendezni fogják.

A cél az összehasonlítási logika megvalósítása oly módon, hogy mindig a legmagasabb prioritású elemet rendelik először. Ezután, amikor eltávolítunk egy elemet a sorunkból, mindig az lesz a legmagasabb prioritású.

Először is, használjuk a várólistánkat egyetlen szálban, szemben azzal, hogy több szálon használjuk. Ezzel megkönnyíti annak bizonyítását, hogy az elemek sorrendben vannak-e az egységteszt során:

PriorityBlockingQueue queue = új PriorityBlockingQueue (); ArrayList polledElements = new ArrayList (); queue.add (1); sor.add (5); sor.add (2); sor.add (3); sor.add (4); queue.drainTo (polledElements); assertThat (polledElements) .conactExactly (1, 2, 3, 4, 5);

Amint láthatjuk, annak ellenére, hogy az elemeket véletlenszerű sorrendben adjuk hozzá a sorba, azok rendezésre kerülnek, amikor elkezdenénk megkérdezni őket. Ez azért van, mert a Egész szám osztályos eszközei Hasonló, amelyet viszont arra használunk, hogy megbizonyosodjunk arról, hogy növekvő sorrendben kivesszük őket a sorból.

Érdemes ezt is megjegyezni ha két elemet összehasonlítunk és megegyezünk, nincs garancia arra, hogy miként rendeljük meg őket.

3. A Sor blokkolni

Ha szokásos sorral állunk szemben, akkor felhívnánk közvélemény kutatás() elemek visszakereséséhez. Ha azonban a sor üres volt, hívjon közvélemény kutatás() visszatérne nulla.

A PriorityBlockingQueue végrehajtja a BlockingQueue felület, amely néhány extra módszert ad nekünk, amelyek lehetővé teszik számunkra blokkolja az üres sorból való eltávolításkor. Próbáljuk meg használni a vesz() módszer, amelynek pontosan ezt kell tennie:

PriorityBlockingQueue queue = új PriorityBlockingQueue (); új szál (() -> {System.out.println ("Polling ..."); próbáld ki az {Integer poll = queue.take (); System.out.println ("Polled:" + poll);} catch ( InterruptedException e) {e.printStackTrace ();}}). Start (); Thread.sleep (TimeUnit.SECONDS.toMillis (5)); System.out.println ("Hozzáadás a várólistához"); queue.add (1);

Bár használ alvás() egy kissé törékeny módszer a dolgok bemutatására, amikor ezt a kódot futtatjuk, látni fogjuk:

Lekérdezés ... Hozzáadás a várakozási sorhoz Lekérdezett: 1 

Ez ezt bizonyítja vesz() blokkolva egy tétel hozzáadásáig:

  1. A szál „Polling” -ot nyomtat annak igazolására, hogy elindult
  2. Ezután a teszt körülbelül öt másodpercig szünetel, hogy bebizonyosodjon, hogy a szálnak hívnia kellett vesz() ekkorra
  3. Hozzáadunk a sorhoz, és ennek bizonyítására többé-kevésbé azonnal látnia kell a „Polled: 1” -t vesz() egy elemet azonnal visszaadott, amint elérhetővé vált

Érdemes megemlíteni azt is, hogy a BlockingQueue Az interfész a blokkolás módjait is biztosítja számunkra a teljes várólistákhoz való hozzáadáskor.

Ugyanakkor a PriorityBlockingQueue korlátlan. Ez azt jelenti, hogy soha nem lesz tele, így mindig lehetséges új elemeket hozzáadni.

4. A blokkolás és a prioritások együttes használata

Most, hogy elmagyaráztuk a PriorityBlockingQueue, használjuk mindkettőt együtt. Egyszerűen bővíthetjük az előző példánkat, de ezúttal további elemeket adunk a sorhoz:

Szálszál = új Szál (() -> {System.out.println ("Polling ..."); míg (true) {próbálkozzon {Integer poll = queue.take (); System.out.println ("Polled: "+ szavazás);} catch (InterruptedException e) {e.printStackTrace ();}}}); szál.indítás (); Thread.sleep (TimeUnit.SECONDS.toMillis (5)); System.out.println ("Hozzáadás a várólistához"); queue.addAll (newArrayList (1, 5, 6, 1, 2, 6, 7)); Thread.sleep (TimeUnit.SECONDS.toMillis (1));

Ismét, bár ez egy kicsit törékeny a használata miatt alvás(), még mindig mutat érvényes használati esetet. Most van egy sorunk, amely blokkol, és várja az elemek hozzáadását. Ezután rengeteg elemet adunk hozzá egyszerre, majd megmutatjuk, hogy azokat prioritási sorrendben kezeljük. A kimenet a következőképpen fog kinézni:

Polling ... Hozzáadás a várólistához Polled: 1 Polled: 1 Polled: 2 Polled: 5 Polled: 6 Polled: 6 Polled: 7

5. Következtetés

Ebben az útmutatóban bemutattuk, hogyan használhatjuk a PriorityBlockingQueue annak érdekében, hogy blokkolhassunk egy szálat, amíg néhány elemet hozzá nem adunk hozzá, és azt is, hogy képesek vagyunk feldolgozni ezeket az elemeket prioritásuk alapján.

Ezeknek a példáknak a megvalósítása megtalálható a GitHub oldalon. Ez egy Maven-alapú projekt, ezért könnyen futtathatónak kell lennie.


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