Selles õpetuses õpime Java BlockingQueue liidest ja selle meetodeid.
BlockingQueue
Liides Java Collections
raamistik laiendab Queue
liides. See võimaldab igal operatsioonil oodata, kuni selle saab edukalt sooritada.
Näiteks kui soovime elemendi tühjast järjekorrast kustutada, siis blokeerimisjärjekord lubab kustutamisoperatsioonil oodata, kuni järjekorras on mõned kustutatavad elemendid.
Klassid, mis rakendavad BlockingQueue'i
Kuna BlockingQueue
see on liides, ei saa me seda otseselt rakendada.
Selle funktsionaalsuse BlockingQueue
kasutamiseks peame kasutama klasse, mis seda rakendavad.
- ArrayBlockingQueue
- LinkedBlockingQueue
Kuidas kasutada blokeerimisjärjekordi?
java.util.concurrent.BlockingQueue
Kasutamiseks peame pakendi importima BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Siin oleme loonud klasside ArrayBlockingQueue
ja LinkedBlockingQueue
vastavalt objektid animal1 ja animal2 . Need objektid saavad kasutada BlockingQueue
liidese funktsionaalsusi .
Blokeerimisjärjekorra meetodid
Selle põhjal, kas järjekord on täis või tühi, saab blokeeriva järjekorra meetodid jagada kolme kategooriasse:
Meetodid, mis põhjustavad erandi
add()
- Lisab blokeerimisjärjekorda elemendi järjekorra lõpus. Kui järjekord on täis, viskab erandi.element()
- tagastab blokeerimisjärjekorra pea. Kui järjekord on tühi, viskab erandi.remove()
- Eemaldab blokeerimisjärjekorrast elemendi. Kui järjekord on tühi, viskab erandi.
Meetodid, mis tagastavad mingi väärtuse
offer()
- Lisab määratud elemendi järjekorra lõpus olevasse blokeerimisjärjekorda. Tagastab,false
kui järjekord on täis.peek()
- tagastab blokeerimisjärjekorra pea. Tagastab,null
kui järjekord on tühi.poll()
- Eemaldab blokeerimisjärjekorrast elemendi. Tagastab,null
kui järjekord on tühi.
Rohkem pakkumisest () ja küsitlusest ()
offer()
Ja poll()
meetodit saab kasutada koos ajalõppude. See tähendab, et saame parameetrina edastada ajaühikud. Näiteks,
offer(value, 100, milliseconds)
Siin,
- väärtus on järjekorda lisatav element
- Ja oleme seadnud ajalõpu 100 millisekundit
See tähendab, et offer()
meetod püüab 100
millisekundite jooksul blokeerimisjärjekorda lisada elemendi . Kui elementi ei saa sisestada 100 millisekundi jooksul, naaseb meetod false
.
Märkus: Selle asemel, et milliseconds
saame kasutada ka need ajaühikute: days
, hours
, minutes
, seconds
, microseconds
ja nanoseconds
on offer()
ja poll()
meetodeid.
Operatsiooni blokeerivad meetodid
BlockingQueue
Ka meetodid blokeerida operatsioonide ja oodata, kui järjekord on täis või tühi.
put()
- Lisab blokeerimisjärjekorda elemendi. Kui järjekord on täis, ootab see, kuni järjekorras on ruumi elemendi sisestamiseks.take()
- Eemaldab ja tagastab blokeerimisjärjekorrast elemendi. Kui järjekord on tühi, ootab see, kuni järjekorras on kustutatavaid elemente.
Oletame, et me tahame lisada elemendid järjekorda. Kui järjekord on täis, put()
ootab meetod, kuni järjekorras on ruumi elementide sisestamiseks.
Samamoodi, kui tahame elemendid järjekorrast kustutada. Kui järjekord on tühi, take()
ootab meetod, kuni järjekord sisaldab kustutatavaid elemente.
BlockingQueue'i rakendamine ArrayBlockingQueue'is
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(); ) ) )
Väljund
BlockingQueue: (2, 1, 3) Eemaldatud element: 2
Lisateabe saamiseks ArrayBlockingQueue
külastage Java ArrayBlockingQueue.
Miks blokeerida järjekord?
Javas BlockingQueue
peetakse seda niiditurvaliseks kollektsiooniks. Selle põhjuseks on see, et sellest võib abi olla mitme lõime toimingul.
Oletame, et üks lõime sisestab järjekorda elemente ja teine lõime eemaldab elemendid järjekorrast.
Kui esimene lõime töötab aeglasemalt, võib blokeerimisjärjekord panna teise lõime ootama, kuni esimene lõime oma töö lõpetab.