Vodič kroz sučelje Java Queue

1. Uvod

U ovom uputstvu razgovarat ćemo o Javi Red sučelje.

Prvo ćemo uzeti a zaviriti u kojem a Red i neke od njegovih osnovnih metoda. Dalje ćemo zaroniti u brojne implementacije koje Java nudi standardno.

Konačno, razgovarat ćemo o sigurnosti niti prije nego što sve zamotamo.

2. Vizualizacija reda čekanja

Krenimo s brzom analogijom.

Zamislite da smo upravo otvorili svoj prvi posao - štand za hrenovke. Novim potencijalnim klijentima želimo služiti na najučinkovitiji mogući način za naše malo poslovanje; jedan po jedan. Prvo ih molimo da formiraju urednu liniju ispred našeg štanda, a novi kupci pridružuju se straga. Zahvaljujući našim organizacijskim vještinama, naše ukusne hrenovke sada možemo distribuirati na pošten način.

Redovi u Javi rade na sličan način. Nakon što proglasimo svoje Red, možemo dodati nove elemente straga i ukloniti ih sprijeda.

Zapravo, najviše Redovi u Java radu ćemo se susresti u ovom prvom ulazu, prvom izlazu način - često skraćenica za FIFO.

Međutim, postoji jedna iznimka koju ćemo dotaknuti kasnije.

3. Osnovne metode

The Red deklarira brojne metode koje trebaju kodirati sve izvedbene klase. Izdvojimo nekoliko važnijihone sada:

  1. ponuda() - Umeće novi element u Red
  2. anketa()- Uklanja element s prednje strane Red
  3. zaviriti () Pregleda element na prednjoj strani Red, a da ga ne ukloni

4. AbstractQueue

AbstractQueue je najjednostavnije moguće Red implementacija koju pruža Java. Uključuje skeletnu provedbu nekih od Red metode sučelja, isključujući ponuda.

Kada kreiramo prilagođeni red produžujući AbstractQueue razred,moramo osigurati provedbuod ponuda metoda što čini ne dopustiti umetanje null elemenata.

Dodatno, moramo pružiti metode zaviriti, anketa, veličina, i java.util‘S iterator.

Sastavimo jednostavan Red provedba koristeći AbstractQueue.

Prvo, definirajmo svoj razred s a LinkedList za pohranu naših Red čekanja elementi:

javna klasa CustomBaeldungQueue proširuje AbstractQueue {privatni elementi LinkedList; javni CustomBaeldungQueue () {this.elements = novi LinkedList (); }}

Dalje, idemo nadjačajte potrebne metode i unesite kod:

@Override public Iterator iterator () {return elements.iterator (); } @Preuzmi javnu int veličinu () {return elements.size (); } @Override javna logička ponuda (T t) {if (t == null) return false; elementi.add (t); povratak istinit; } @Override javna T anketa () {Iterator iter = elements.iterator (); T t = iter.next (); if (t! = null) {iter.remove (); povrat t; } return null; } @Override public T peek () {return elements.getFirst (); }

Izvrsno, provjerimo da li radi brzim unit testom:

customQueue.add (7); customQueue.add (5); int prvo = customQueue.poll (); int drugo = customQueue.poll (); assertEquals (7, prvi); assertEquals (5, drugo);

4. Pod-sučelja

Općenito, Red sučelje nasljeđuje 3 glavna podsučelja. Blokiranje redova, Redovi prijenosa, i Deques.

Zajedno, ova 3 sučelja implementira velika većina dostupnih Java Redovi. Kratko ćemo pogledati što su postavljena ova sučelja.

4.1. Blokiranje redova

The BlockingQueue sučelje podržava dodatne operacije koje prisiljavaju niti da čekaju na Redovisno o trenutnom stanju. Konac može pričekajte na Red da bude prazno pri pokušaju dohvaćanja ili da ono postane prazno pri dodavanju novi element.

Standard Blokiranje redova uključuju LinkedBlockingQueue, SynchronousQueue, i ArrayBlockingQueue.

Za više informacija, pogledajte naš članak o Blokiranje redova.

4.2. Redovi prijenosa

The Red za prijenos sučelje proširuje BlockingQueue sučelje ali je prilagođen uzorku proizvođač-potrošač. Kontrolira protok informacija od proizvođača do potrošača, stvarajući povratni pritisak u sustavu.

Java se isporučuje s jednom implementacijom Red za prijenos sučelje, LinkedTransferQueue.

4.3. Deques

Deque je kratica za Du mogućnosti-Ended Queue i analogan je špilu karata - elementi se mogu uzimati i s početka i s kraja Deque. Slično kao i tradicionalni Red, the Deque pruža metode za dodavanje, dohvaćanje i zavirivanje elemenata koji se nalaze na vrhu i na dnu.

Za detaljan vodič o tome kako Deque radi, pogledajte naše ArrayDeque članak.

5. Redovi prioriteta

Ranije smo vidjeli da većina Redovi na koje nailazimo u Javi slijede FIFO princip.

Jedna od takvih iznimki od ovog pravila je PriorityQueue. Kada se novi elementi umetnu u PrioritetRed, naručeni su na temelju njihovog prirodnog uređenja ili prema definiranom Usporednik pod uvjetom da konstruiramo PrioritetRed.

Pogledajmo kako ovo funkcionira jednostavnim jediničnim testom:

PriorityQueue integerQueue = novi PriorityQueue (); integerQueue.add (9); integerQueue.add (2); integerQueue.add (4); int prvo = integerQueue.poll (); int drugo = integerQueue.poll (); int treće = integerQueue.poll (); assertEquals (2, prvo); assertEquals (4, druga); assertEquals (9, treće);

Unatoč redoslijedu dodavanja naših cijelih brojeva u PrioritetRed, to možemo vidjeti redoslijed pretraživanja mijenja se prema prirodnom redoslijedu brojeva.

Možemo vidjeti da isto vrijedi i kada se primijeni na Žice:

PriorityQueue stringQueue = novi PriorityQueue (); stringQueue.add ("borovnica"); stringQueue.add ("jabuka"); stringQueue.add ("trešnja"); Niz prvi = stringQueue.poll (); Niz drugi = stringQueue.poll (); Niz treći = stringQueue.poll (); assertEquals ("jabuka", prvo); assertEquals ("borovnica", druga); assertEquals ("trešnja", treća);

6. Sigurnost navoja

Dodavanje predmeta u Redovi posebno je koristan u okruženjima s više navoja. A Red mogu se dijeliti između niti i koristiti se za blokiranje napretka dok se ne oslobodi prostor - pomažući nam prevladati neke uobičajene probleme s više niti.

Na primjer, pisanje na jedan disk iz više niti stvara sukob resursa i može dovesti do sporog vremena pisanja. Stvaranje jedne niti pisca pomoću a BlockingQueue može ublažiti ovaj problem i dovesti do znatno poboljšanih brzina pisanja.

Srećom, Java nudi ConcurrentLinkedQueue, ArrayBlockingQueue, i ConcurrentLinkedDeque koji su sigurni za nit i savršeni za programe s više niti.

7. Zaključak

U ovom smo uputstvu duboko zarobili Javu Red sučelje.

Prvo, mi istraživao što a Red čini, kao i implementacije koje Java nudi.

Dalje, mi pogledao a Red's uobičajenim FIFO principom, kao i PriorityQueue koja se razlikuje po svom redoslijedu.

Konačno, mi istražena sigurnost niti i kako Redovi može se koristiti u okruženju s više navoja.

Kao i uvijek, kôd je dostupan na GitHub-u.