Šioje pamokoje sužinosime apie „Java BlockingQueue“ sąsają ir jos metodus.
„ BlockingQueue
Java“ Collections
sistemos Queue
sąsaja išplečia sąsają. Tai leidžia bet kokiai operacijai palaukti, kol ją bus galima sėkmingai atlikti.
Pavyzdžiui, jei norime ištrinti elementą iš tuščios eilės, tada blokavimo eilė leidžia ištrynimo operacijai palaukti, kol eilėje bus keletas elementų, kuriuos reikia ištrinti.
Klasės, įgyvendinančios „BlockingQueue“
Kadangi BlockingQueue
tai yra sąsaja, negalime tiesiogiai jos įgyvendinti.
Norėdami naudoti „“ funkcionalumą BlockingQueue
, turime naudoti klases, kurios jį įgyvendina.
- „ArrayBlockingQueue“
- „LinkedBlockingQueue“
Kaip naudotis blokavimo eilėmis?
Norėdami naudoti, turime importuoti java.util.concurrent.BlockingQueue
paketą BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Čia, mes sukūrėme objektai animal1 ir animal2 klasių ArrayBlockingQueue
ir LinkedBlockingQueue
, atitinkamai. Šie objektai gali naudoti BlockingQueue
sąsajos funkcijas .
Blokavimo eilės metodai
Pagal tai, ar eilė pilna, ar tuščia, blokavimo eilės metodus galima suskirstyti į 3 kategorijas:
Metodai, kurie lemia išimtį
add()
- Įterpia elementą į blokuojančią eilę eilės pabaigoje. Išmeta išimtį, jei eilė pilna.element()
- grąžina blokavimo eilės galvą. Išmeta išimtį, jei eilė tuščia.remove()
- Pašalina elementą iš blokavimo eilės. Išmeta išimtį, jei eilė tuščia.
Metodai, kurie grąžina tam tikrą vertę
offer()
- Įterpia nurodytą elementą į blokavimo eilę eilės pabaigoje. Grąžina,false
jei eilė pilna.peek()
- grąžina blokavimo eilės galvą. Grąžina,null
jei eilė tuščia.poll()
- Pašalina elementą iš blokavimo eilės. Grąžina,null
jei eilė tuščia.
Daugiau apie pasiūlymą () ir apklausą ()
offer()
Ir poll()
metodas gali būti naudojamas su praėjęs laikas. Tai yra, mes galime perduoti laiko vienetus kaip parametrą. Pavyzdžiui,
offer(value, 100, milliseconds)
Čia
- reikšmė yra elementas, kuris bus įterptas į eilę
- Mes nustatėme 100 milisekundžių skirtąjį laiką
Tai reiškia, kad offer()
metodas bandys įterpti elementą į blokavimo eilę 100
milisekundėmis. Jei elemento neįmanoma įterpti per 100 milisekundžių, metodas grąžinamas false
.
Pastaba: Vietoj milliseconds
, mes taip pat gali naudoti šiuos laiko vienetus: days
, hours
, minutes
, seconds
, microseconds
ir nanoseconds
į offer()
ir poll()
metodai.
Operaciją blokuojantys metodai
Taip BlockingQueue
pat pateikiami metodai, kaip blokuoti operacijas ir laukti, jei eilė pilna ar tuščia.
put()
- Įterpia elementą į blokavimo eilę. Jei eilė pilna, ji lauks, kol eilėje bus vietos elementui įterpti.take()
- Pašalina ir grąžina elementą iš blokavimo eilės. Jei eilė tuščia, ji lauks, kol eilėje bus ištrinti elementai.
Tarkime, mes norime į eilę įterpti elementų. Jei eilė pilna, put()
metodas palauks, kol eilėje bus vietos elementams įterpti.
Panašiai, jei norime iš eilės ištrinti elementus. Jei eilė tuščia, take()
metodas palauks, kol eilėje bus elementai, kuriuos reikia ištrinti.
„BlockingQueue“ įdiegimas „ArrayBlockingQueue“
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main ( public static void main(String() args) ( // Create a blocking queue using the ArrayBlockingQueue BlockingQueue numbers = new ArrayBlockingQueue(5); try ( // Insert element to blocking queue numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("BLockingQueue: " + numbers); // Remove Elements from blocking queue int removedNumber = numbers.take(); System.out.println("Removed Number: " + removedNumber); ) catch(Exception e) ( e.getStackTrace(); ) ) )
Rezultatas
„BlockingQueue“: (2, 1, 3) Pašalintas elementas: 2
Norėdami sužinoti daugiau apie tai ArrayBlockingQueue
, apsilankykite „Java ArrayBlockingQueue“.
Kodėl verta blokuoti eilę?
„Java“ kalba BlockingQueue
yra laikoma saugia kolekcija. Taip yra todėl, kad tai gali būti naudinga atliekant kelių gijų operacijas.
Tarkime, viena gija įterpia elementus į eilę, o kita gija pašalina elementus iš eilės.
Dabar, jei pirmasis siūlas veikia lėčiau, blokavimo eilė gali priversti antrąją giją laukti, kol pirmoji gija užbaigs savo operaciją.