Dans ce tutoriel, nous allons découvrir l'interface Java BlockingQueue et ses méthodes.
L' BlockingQueue
interface du Collections
framework Java étend l' Queue
interface. 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 BlockingQueue
s'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.BlockingQueue
package 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 ArrayBlockingQueue
et LinkedBlockingQueue
, respectivement. Ces objets peuvent utiliser les fonctionnalités de l' BlockingQueue
interface.
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. Renvoiefalse
si la file d'attente est pleine.peek()
- Renvoie la tête de la file d'attente de blocage. Renvoienull
si la file d'attente est vide.poll()
- Supprime un élément de la file d'attente de blocage. Renvoienull
si 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 100
millisecondes. 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
, microseconds
et nanoseconds
dans offer()
et poll()
méthodes.
Méthodes qui bloquent l'opération
Le BlockingQueue
fournit é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, BlockingQueue
est 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.