Što je BlockingQueue u Javi i kako ga implementirati?



Ovaj članak o BlockingQueue u Javi pomoći će vam da saznate više o sučelju BlockingQueue. Također će vam dati uvid u njegove metode i praktičnu provedbu

je izuzetno popularan među programerima zbog svog širokog raspona ugrađenih značajki. Većinu puta ćete imati posebno rješenje za svoj problem čak i prije nego što se pojavi. Tako izuzetno koristan i važan dio je BlockingQueue sučelje u Javi. Kroz medij ovog članka bacit ću malo svjetla na BlockingQueue u Javi i metode za njegovu primjenu.

Ispod su teme obrađene u ovom članku:





Sučelje BlockingQueue u Javi

BlockingQueue u Javi je sučelje koje je dodano u Javi 1.5 zajedno s nekoliko drugih istovremenih klasa uslužnih programa poput ConcurrentHashMap, CopyOnWriteArrrayList itd. Sučelje BlockingQueue pripada java.util.concurrent paket .Ovo sučelje poboljšava kontrolu protoka aktiviranjem blokiranja, u slučaju da nit pokušava izbaciti prazan red iz cijelog reda u red čekanja. U oba slučaja ovo sučelje dobro dođe.Jednostavnije rečeno, pretpostavimo a pokušava dodati elemente u već pun redoslijed. U ovom će se trenutku u programu pozivati ​​BlockingQueue koji će blokirati tu određenu nit dok druga nit ne oslobodi red kako bi napravila prostor. To može biti rezultat uklanjanja redoslijeda elemenata za čišćenje cijelog reda. Slično tome, BlockingQueue će se pozivati ​​da blokira nit koja pokušava ukloniti već prazan red dok se neka druga nit ne umetne ili doda element u prazno red .

Tijekom rada sa sučeljem BlockingQueue u Javi, morate imati na umu da ono ne prihvaća null vrijednost. U slučaju da to pokušate odmah će baciti NullPointerException. Sljedeća slika predstavlja rad sučelja BlockingQueue u Javi.



stvoriti parametar u tablici

BlockingQueue - BlockingQueue u Javi - EdurekaOvaj sučelje uglavnom se koristi između proizvođača i potrošača jer je zaštićen od navoja.Ono što mislim je da se BlockingQueue sučelje može koristiti za stvaranje reda koji mogu dijeliti i proizvođač i potrošač

Da biste mogli raditi s BlockingQueue u Javi, prvo se morate upoznati s njegovim vrstama. Dopustite mi da vas upoznam s njima u sljedećem odjeljku ovog članka.

Vrste konstruktora za BlockingQueue u Javi

Postoje dvije vrste konstruktora za sučelje BlockingQueue u Javi:



  • Neograničeni red čekanja: Za ovu vrstu reda kapacitet će biti postavljen na Integer.MAX_VALUE. Neograničeni red nikad se neće blokirati jer može dinamički rasti svaki put kad se u njega ubaci element. Ispod je sintaksa za stvaranje neograničenog reda:
BlockingQueue bq = novi LinkedBlockingDeque ()
  • Ograničeni red čekanja: Za ovu vrstu reda morate proći kapacitet reda u vrijeme njegovog stvaranja, tj. Kao graditelj parametar. Jednom kada je veličina dodijeljena, ne može se mijenjati. Ispod je sintaksa za stvaranje ograničenog reda:
BlockingQueue bq = novi LinkedBlockingDeque (10)

Sad kad ste upoznati s načinima implementacije BlockingQueue u Javi, dopustite mi da nabrojim nekoliko njegovih metoda.

Metode u sučelju BlockingQueue

Metoda Opis
logički dodatak (E e) Ova metoda pomaže u umetanju navedenog elementa u ovaj red ako u redu za čekanje ima mjestabaciti anIllegalStateException
boolean sadrži (objekt o) Ova metoda vraća true ako red sadrži navedeni element
int drainTo (Zbirka c) Ova će metoda ukloniti sve dostupne elemente iz reda i dodati ih u navedenu zbirku
int drainTo (Zbirka c, int maxElements) Ova će metoda ukloniti zadani broj dostupnih elemenata iz reda i dodati ih u navedeni
booloean ponuda (E e) Ova će metoda umetnuti navedeni element u red ako nije pun i vratit će true, inače će vratiti false
logička ponuda (E e, dugo istek, jedinica vremenske jedinice) Ova će metoda umetnuti navedeni element u red čekanja. U slučaju da je red pun, pričekat će do određenog vremena čekanja da prostor postane dostupan.
E anketa (dugo čekanje, jedinica vremenske jedinice) Ova metoda pomaže u dohvaćanju i uklanjanju glave reda. U slučaju da je red prazan, pričekat će do određenog vremena čekanja da element postane dostupan
praznina (E e) Ova će metoda umetnuti navedeni element u red čekanjem da prostor postane dostupan n ako je red pun
int preostali kapacitet () Ova metoda pomaže u vraćanju broja dodatnih elemenata koje ovaj red idealno može prihvatiti bez blokiranja
logičko uklanjanje (objekt o) Ova će metoda ukloniti jedan primjerak navedenog elementa iz reda samo ako je prisutan
E uzmi () Ova metoda pomoći će u dohvaćanju i uklanjanju glave reda čekanjem da element postane dostupan, u slučaju da je red prazan.

Implementacije BlockingQueue

Ovdje ću implementirati jednostavan primjer BlockingQueue u Javi, gdjeklasa EduProducer generirat će podatke i umetnuti ih u red , istovremeno, druga klasa, EduConsumer će ukloniti podatke iz istog reda.

Za ovo ću stvoriti 3 razreda, i to:

  1. EduProducer
  2. EduConsumer
  3. EdurekaMain

Stvorimo sada svaki od ovih razreda jedan po jedan.

EduProducer.java

paket edureka import java.util.concurrent.BlockingQueue javna klasa EduProducer implementira Runnable {private final BlockingQueue queue @Override public void run () {try {process ()} catch (InterruptedException e) {Thread.currentThread (). interrupt ()} } private void process () baca InterruptedException {// Stavi 10 intova u Red čekanja za (int i = 0 i<10 i++) { System.out.println('[Producer] Add : ' + i) queue.put(i) System.out.println('[Producer] Queue's Remaining Capacity : ' + queue.remainingCapacity()) Thread.sleep(150) } } public EduProducer(BlockingQueue queue) { this.queue = queue } }

EduConsumer.java

paket edureka import java.util.concurrent.BlockingQueue javna klasa EduConsumer implementira Runnable {private final BlockingQueue queue @Override public void run () {try {while (true) {Integer take = queue.take () process (take)}} catch (InterruptException e) {Thread.currentThread (). Interrupt ()}} privatni void postupak (Integer take) baca InterruptedException {System.out.println ('[Consumer] Remove:' + take) Thread.sleep (500)} javni EduConsumer (BlockingQueue queue) {this.queue = queue}}

EdurekaMain.java

paket edureka import java.util.concurrent.BlockingQueue import java.util.concurrent.LinkedBlockingQueue javna klasa EdurekaMain {public static void main (String [] args) {BlockingQueue queue = new LinkedBlockingQueue (10) new Thread (new EduProducer (queue) .start () nova nit (nova EduConsumer (red čekanja)). start ()}}

Kada završite s pisanjem koda, pokrenite program da biste dobili donji izlaz:

[Proizvođač] Dodaj: 0 [Potrošač] Uzmi: 0 [Proizvođač] Preostali kapacitet reda: 9 [Proizvođač] Dodaj: 1 [Proizvođač] Preostali kapacitet reda: 9 [Proizvođač] Dodaj: 2 [Proizvođač] Preostali kapacitet reda: 8 [Proizvođač ] Dodati: 3 [preostali kapacitet proizvođača]: 7 [potrošač] uzeti: 1 [proizvođač] dodati: 4 'preostali kapacitet reda proizvođača': 7 [proizvođač] dodati: 5 [proizvođač] preostali kapacitet reda: 6 [proizvođač] dodati : 6 [Preostali kapacitet redatelja]: Producent: 5 [Potrošač] Uzmi: 2 [Proizvođač] Dodaj: 7 [Preostali kapacitet proizvođača] Red: 5 [Proizvođač] Dodaj: 8 [Proizvođač] Preostali kapacitet reda: 4 [Proizvođač] Dodaj: 9 [Proizvođač] Preostali kapacitet reda: 3 [Potrošač] Uzmi: 3 [Potrošač] Uzmi: 4 [Potrošač] Uzmi: 5 [Potrošač] Uzmi: 6 [Potrošač] Uzmi: 7 [Potrošač] Uzmi: 8 [Potrošač] Uzmi: 9

To nas dovodi do kraja ovog članka o BlockingQueue u Javi. Ako želite detaljnije naučiti Javu, možete se obratiti našoj također.

Sad kad ste razumjeli osnove BlockingQueuea na Javi, pogledajte Edureka, pouzdane tvrtke za internetsko učenje s mrežom od više od 250 000 zadovoljnih učenika raširenih širom svijeta. Edurekin tečaj za obuku i certificiranje Java J2EE i SOA osmišljen je za studente i profesionalce koji žele biti programer za Javu. Tečaj je osmišljen kako bi vam dao početnu prednost u Java programiranju i osposobio vas za osnovne i napredne Java koncepte, zajedno s raznim Java okvirima poput Hibernate & Spring.

Imate pitanje za nas? Molimo vas da ga spominjete u odjeljku za komentare ovog 'BlockingQueue u Javi', a mi ćemo vam se javiti u najkraćem mogućem roku.