În acest tutorial, vom afla despre interfața Java BlockingQueue și metodele sale.
BlockingQueue
Interfața de Java Collections
cadru extinde Queue
interfața. Permite oricărei operațiuni să aștepte până când poate fi efectuată cu succes.
De exemplu, dacă dorim să ștergem un element dintr-o coadă goală, atunci coada de blocare permite operației de ștergere să aștepte până când coada conține unele elemente care trebuie șterse.
Clase care implementează BlockingQueue
Deoarece BlockingQueue
este o interfață, nu putem oferi implementarea directă a acesteia.
Pentru a utiliza funcționalitatea BlockingQueue
, trebuie să folosim clase care o implementează.
- ArrayBlockingQueue
- LinkedBlockingQueue
Cum se utilizează cozile de blocare?
java.util.concurrent.BlockingQueue
Pentru a putea utiliza, trebuie să importăm pachetul BlockingQueue
.
// Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue();
Aici, am creat obiecte animal1 și animal2 din clase ArrayBlockingQueue
și LinkedBlockingQueue
, respectiv. Aceste obiecte pot utiliza funcționalitățile BlockingQueue
interfeței.
Metode de BlockingQueue
Pe baza faptului că o coadă este plină sau goală, metodele unei cozi de blocare pot fi împărțite în 3 categorii:
Metode care aruncă o excepție
add()
- Inserează un element în coada de blocare la sfârșitul cozii. Aruncă o excepție dacă coada este plină.element()
- Returnează capul cozii de blocare. Aruncă o excepție dacă coada este goală.remove()
- Elimină un element din coada de blocare. Aruncă o excepție dacă coada este goală.
Metode care returnează o anumită valoare
offer()
- Inserează elementul specificat în coada de blocare la sfârșitul cozii. Revinefalse
dacă coada este plină.peek()
- Returnează capul cozii de blocare. Revinenull
dacă coada este goală.poll()
- Elimină un element din coada de blocare. Revinenull
dacă coada este goală.
Mai multe oferte () și sondaj ()
Metoda offer()
și poll()
poate fi utilizată cu expirări. Adică, putem trece unități de timp ca parametru. De exemplu,
offer(value, 100, milliseconds)
Aici,
- value este elementul care trebuie inserat în coadă
- Și am stabilit un timeout de 100 de milisecunde
Aceasta înseamnă că offer()
metoda va încerca să insereze un element în coada de blocare pentru 100
milisecunde. Dacă elementul nu poate fi inserat în 100 de milisecunde, metoda revine false
.
Notă: În loc milliseconds
, putem folosi , de asemenea , aceste unități de timp: days
, hours
, minutes
, seconds
, microseconds
și nanoseconds
în offer()
și poll()
metode.
Metode care blochează operațiunea
De BlockingQueue
asemenea, oferă metode pentru a bloca operațiunile și a aștepta dacă coada este plină sau goală.
put()
- Inserează un element în coada de blocare. Dacă coada este plină, va aștepta până când coada are spațiu pentru a insera un element.take()
- Elimină și returnează un element din coada de blocare. Dacă coada este goală, va aștepta până când coada are elemente de șters.
Să presupunem că vrem să inserăm elemente într-o coadă. Dacă coada este plină, atunci put()
metoda va aștepta până când coada are spațiu pentru a insera elemente.
În mod similar, dacă vrem să ștergem elemente dintr-o coadă. Dacă coada este goală, atunci take()
metoda va aștepta până când coada conține elemente care trebuie șterse.
Implementarea BlockingQueue în 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(); ) ) )
Ieșire
BlockingQueue: (2, 1, 3) Element eliminat: 2
Pentru a afla mai multe despre ArrayBlockingQueue
, vizitați Java ArrayBlockingQueue.
De ce BlockingQueue?
În Java, BlockingQueue
este considerată colecția sigură pentru fire . Acest lucru se datorează faptului că poate fi util în operațiile cu mai multe fire.
Să presupunem că un fir introduce elemente în coadă și un alt fir elimină elemente din coadă.
Acum, dacă primul fir rulează mai lent, atunci coada de blocare poate face ca al doilea fir să aștepte până când primul fir își finalizează operațiunea.