Šajā apmācībā mēs uzzināsim par Java BlockingQueue saskarni un tās metodēm.
BlockingQueue
Java interfeisu Collections
ietvaros paplašina Queue
interfeisu. Tas ļauj jebkurai operācijai gaidīt, līdz to var veiksmīgi veikt.
Piemēram, ja mēs vēlamies dzēst elementu no tukšas rindas, tad bloķēšanas rinda ļauj dzēšanas operācijai gaidīt, kamēr rindā būs daži dzēšamie elementi.
Klases, kas ievieš bloķēšanas rindu
Tā kā BlockingQueue
tā ir saskarne, mēs nevaram nodrošināt tās tiešu ieviešanu.
Lai izmantotu grupas funkcionalitāti BlockingQueue
, mums jāizmanto klases, kas to ievieš.
- ArrayBlockingQueue
- LinkedBlockingQueue
Kā izmantot bloķēšanas rindas?
java.util.concurrent.BlockingQueue
Lai to izmantotu, mums jāimportē pakete BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Šeit mēs esam izveidojuši attiecīgi klases ArrayBlockingQueue
un objekta animal1 un animal2 priekšmetus LinkedBlockingQueue
. Šie objekti var izmantot BlockingQueue
saskarnes funkcionalitāti .
Bloķēšanas rindas metodes
Pamatojoties uz to, vai rinda ir pilna vai tukša, bloķēšanas rindas metodes var iedalīt 3 kategorijās:
Metodes, kas rada izņēmumu
add()
- ievieto bloķēšanas rindā elementu rindas beigās. Izmet izņēmumu, ja rinda ir pilna.element()
- atgriež bloķēšanas rindas galvu. Izmet izņēmumu, ja rinda ir tukša.remove()
- noņem elementu no bloķēšanas rindas. Izmet izņēmumu, ja rinda ir tukša.
Metodes, kas atgriež kādu vērtību
offer()
- ievieto norādīto elementu bloķēšanas rindā rindas beigās. Atgriež,false
ja rinda ir pilna.peek()
- atgriež bloķēšanas rindas galvu. Atgriež,null
ja rinda ir tukša.poll()
- noņem elementu no bloķēšanas rindas. Atgriež,null
ja rinda ir tukša.
Vairāk par piedāvājumu () un aptauju ()
offer()
Un poll()
metodi var izmantot ar noildze. Tas ir, mēs varam nodot laika vienības kā parametru. Piemēram,
offer(value, 100, milliseconds)
Šeit,
- vērtība ir elements, kas jāievieto rindā
- Un mēs esam iestatījuši taimautu 100 milisekundes
Tas nozīmē, ka offer()
metode mēģinās ievietot elementu bloķēšanas rindā 100
milisekundes. Ja elementu nevar ievietot 100 milisekundēs, metode atgriežas false
.
Piezīme: Tā vietā milliseconds
, mēs varam arī izmantot šos laika vienībās: days
, hours
, minutes
, seconds
, microseconds
un nanoseconds
kas offer()
un poll()
metodes.
Metodes, kas bloķē darbību
Tiek piedāvātas BlockingQueue
arī metodes, kā bloķēt operācijas un gaidīt, vai rinda ir pilna vai tukša.
put()
- bloķēšanas rindā ievieto elementu. Ja rinda ir pilna, tā gaidīs, kamēr rindā būs vietas elementa ievietošanai.take()
- noņem un atdod elementu no bloķēšanas rindas. Ja rinda ir tukša, tā gaidīs, kamēr rindā būs dzēšami elementi.
Pieņemsim, ka mēs vēlamies ievietot elementus rindā. Ja rinda ir pilna, put()
metode gaidīs, kamēr rindā būs vietas elementu ievietošanai.
Līdzīgi, ja mēs vēlamies dzēst elementus no rindas. Ja rinda ir tukša, take()
metode gaidīs, kamēr rindā būs dzēšamie elementi.
BlockingQueue ieviešana 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(); ) ) )
Rezultāts
BlockingQueue: (2, 1, 3) Noņemts elements: 2
Lai uzzinātu vairāk par to ArrayBlockingQueue
, apmeklējiet Java ArrayBlockingQueue.
Kāpēc bloķēšanas rinda?
Java valodā tā BlockingQueue
tiek uzskatīta par vītnei drošu kolekciju. Tas ir tāpēc, ka tas var būt noderīgs vairāku pavedienu operācijās.
Pieņemsim, ka viens pavediens ievieto rindā elementus, bet cits pavediens noņem elementus no rindas.
Tagad, ja pirmais pavediens darbojas lēnāk, bloķēšanas rinda var likt otrajam pavedienam gaidīt, kamēr pirmais pavediens pabeidz savu darbību.