Interfață Java BlockingQueue

În acest tutorial, vom afla despre interfața Java BlockingQueue și metodele sale.

BlockingQueueInterfața de Java Collectionscadru extinde Queueinterfaț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 BlockingQueueeste 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.BlockingQueuePentru 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 BlockingQueueinterfeț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. Revine falsedacă coada este plină.
  • peek()- Returnează capul cozii de blocare. Revine nulldacă coada este goală.
  • poll()- Elimină un element din coada de blocare. Revine nulldacă 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 100milisecunde. 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 BlockingQueueasemenea, 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, BlockingQueueeste 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.

Articole interesante...