Interface Java BlockingQueue

Dans ce tutoriel, nous allons découvrir l'interface Java BlockingQueue et ses méthodes.

L' BlockingQueueinterface du Collectionsframework Java étend l' Queueinterface. Il permet à toute opération d'attendre jusqu'à ce qu'elle puisse être exécutée avec succès.

Par exemple, si nous voulons supprimer un élément d'une file d'attente vide, alors la file d'attente de blocage permet à l'opération de suppression d'attendre que la file d'attente contienne certains éléments à supprimer.

Classes qui implémentent BlockingQueue

Puisqu'il BlockingQueues'agit d'une interface, nous ne pouvons pas en fournir l'implémentation directe.

Pour utiliser la fonctionnalité de BlockingQueue, nous devons utiliser des classes qui l'implémentent.

  • ArrayBlockingQueue
  • LinkedBlockingQueue

Comment utiliser les files d'attente de blocage?

Nous devons importer le java.util.concurrent.BlockingQueuepackage pour pouvoir l'utiliser BlockingQueue.

 // Array implementation of BlockingQueue BlockingQueue animal1 = new ArraryBlockingQueue(); // LinkedList implementation of BlockingQueue BlockingQueue animal2 = new LinkedBlockingQueue(); 

Ici, nous avons créé des objets animal1 et animal2 de classes ArrayBlockingQueueet LinkedBlockingQueue, respectivement. Ces objets peuvent utiliser les fonctionnalités de l' BlockingQueueinterface.

Méthodes de BlockingQueue

Selon qu'une file d'attente est pleine ou vide, les méthodes d'une file d'attente de blocage peuvent être divisées en 3 catégories:

Méthodes qui lèvent une exception

  • add()- Insère un élément dans la file d'attente de blocage à la fin de la file d'attente. Lève une exception si la file d'attente est pleine.
  • element()- Renvoie la tête de la file d'attente de blocage. Lève une exception si la file d'attente est vide.
  • remove()- Supprime un élément de la file d'attente de blocage. Lève une exception si la file d'attente est vide.

Méthodes qui renvoient une certaine valeur

  • offer()- Insère l'élément spécifié dans la file d'attente de blocage à la fin de la file d'attente. Renvoie falsesi la file d'attente est pleine.
  • peek()- Renvoie la tête de la file d'attente de blocage. Renvoie nullsi la file d'attente est vide.
  • poll()- Supprime un élément de la file d'attente de blocage. Renvoie nullsi la file d'attente est vide.

En savoir plus sur l'offre () et le sondage ()

La méthode offer()and poll()peut être utilisée avec des délais d'expiration. Autrement dit, nous pouvons passer des unités de temps en tant que paramètre. Par exemple,

 offer(value, 100, milliseconds) 

Ici,

  • valeur est l'élément à insérer dans la file d'attente
  • Et nous avons défini un délai d'expiration de 100 millisecondes

Cela signifie que la offer()méthode essaiera d'insérer un élément dans la file d'attente de blocage pendant des 100millisecondes. Si l'élément ne peut pas être inséré dans 100 millisecondes, la méthode retourne false.

Note: Au lieu de milliseconds, nous pouvons également utiliser ces unités de temps: days, hours, minutes, seconds, microsecondset nanosecondsdans offer()et poll()méthodes.

Méthodes qui bloquent l'opération

Le BlockingQueuefournit également des méthodes pour bloquer les opérations et attendre si la file d'attente est pleine ou vide.

  • put()- Insère un élément dans la file d'attente de blocage. Si la file d'attente est pleine, elle attendra que la file d'attente ait de l'espace pour insérer un élément.
  • take()- Supprime et renvoie un élément de la file d'attente de blocage. Si la file d'attente est vide, elle attendra que la file d'attente contienne des éléments à supprimer.

Supposons que nous voulions insérer des éléments dans une file d'attente. Si la file d'attente est pleine, la put()méthode attendra que la file d'attente ait de l'espace pour insérer des éléments.

De même, si nous voulons supprimer des éléments d'une file d'attente. Si la file d'attente est vide, la take()méthode attendra que la file d'attente contienne des éléments à supprimer.

Implémentation de BlockingQueue dans 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(); ) ) ) 

Production

 BlockingQueue: (2, 1, 3) Élément supprimé: 2 

Pour en savoir plus ArrayBlockingQueue, visitez Java ArrayBlockingQueue.

Pourquoi BlockingQueue?

En Java, BlockingQueueest considérée comme la collection thread-safe . C'est parce que cela peut être utile dans les opérations multi-threading.

Supposons qu'un thread insère des éléments dans la file d'attente et qu'un autre thread supprime des éléments de la file d'attente.

Maintenant, si le premier thread s'exécute plus lentement, la file d'attente de blocage peut faire attendre le deuxième thread jusqu'à ce que le premier thread termine son opération.

Articles intéressants...