Java LinkedBlockingQueue

Dans ce tutoriel, nous allons en apprendre davantage sur la classe LinkedBLockingQueue et ses méthodes à l'aide d'exemples.

La LinkedBlockingQueueclasse du Collectionsframework Java fournit l'implémentation de la file d'attente de blocage à l'aide d'une liste liée.

Il implémente l'interface Java BlockingQueue.

Création de LinkedBlockingQueue

Afin de créer une file d'attente de blocage liée, nous devons importer le java.util.concurrent.LinkedBlockingQueuepackage.

Voici comment nous pouvons créer une file d'attente de blocage liée en Java:

1. Sans la capacité initiale

 LinkedBlockingQueue animal = new LinkedBlockingQueue(); 

Ici, la capacité initiale par défaut sera de 2 31 -1.

2. Avec la capacité initiale

 LinkedBlockingQueue animal = new LinkedBlockingQueue(int capacity); 

Ici,

  • Type - le type de la file d'attente de blocage liée
  • capacité - la taille de la file d'attente de blocage liée

Par exemple,

 // Creating String type LinkedBlockingQueue with size 5 LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Creating Integer type LinkedBlockingQueue with size 5 LinkedBlockingQueue age = new LinkedBlockingQueue(5); 

Remarque: il n'est pas obligatoire de fournir la taille de la liste chaînée.

Méthodes de LinkedBlockingQueue

La LinkedBlockingQueueclasse fournit l'implémentation de toutes les méthodes de l'interface BlockingQueue.

Ces méthodes sont utilisées pour insérer, accéder et supprimer des éléments des files d'attente de blocage liées.

En outre, nous allons découvrir deux méthodes put()et take()qui prennent en charge l'opération de blocage dans la file d'attente de blocage liée.

Ces deux méthodes distinguent la file d'attente de blocage liée des autres files d'attente classiques.

Insérer des éléments

  • add()- Insère un élément spécifié dans la file d'attente de blocage liée. Il lève une exception si la file d'attente est pleine.
  • offer()- Insère un élément spécifié dans la file d'attente de blocage liée. Il retourne falsesi la file d'attente est pleine.

Par exemple,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Using add() animals.add("Dog"); animals.add("Cat"); // Using offer() animals.offer("Horse"); System.out.println("LinkedBlockingQueue: " + animals); ) ) 

Production

 LinkedBlockingQueue: (Chien, Chat, Cheval) 

Éléments d'accès

  • peek()- Renvoie un élément à l'avant de la file d'attente de blocage liée. Il retourne nullsi la file d'attente est vide.
  • iterator()- Renvoie un objet itérateur pour accéder séquentiellement à un élément de la file d'attente de blocage liée. Il lève une exception si la file d'attente est vide. Nous devons importer le java.util.Iteratorpackage pour l'utiliser.

Par exemple,

 import java.util.concurrent.LinkedBlockingQueue; import java.util.Iterator; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); // Add elements animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue: " + animals); // Using peek() String element = animals.peek(); System.out.println("Accessed Element: " + element); // Using iterator() Iterator iterate = animals.iterator(); System.out.print("LinkedBlockingQueue Elements: "); while(iterate.hasNext()) ( System.out.print(iterate.next()); System.out.print(", "); ) ) ) 

Production

 LinkedBlockingQueue: (Dog, Cat, Horse) Élément consulté: Dog LinkedBlockingQueue Elements: Dog, Cat, Horse, 

Supprimer des éléments

  • remove()- Renvoie et supprime un élément spécifié de la file d'attente de blocage liée. Il lève une exception si la file d'attente est vide.
  • poll()- Renvoie et supprime un élément spécifié de la file d'attente de blocage liée. Il retourne nullsi la file d'attente est vide.
  • clear() - Supprime tous les éléments de la file d'attente de blocage liée.

Par exemple,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); animals.add("Dog"); animals.add("Cat"); animals.add("Horse"); System.out.println("LinkedBlockingQueue " + animals); // Using remove() String element1 = animals.remove(); System.out.println("Removed Element:"); System.out.println("Using remove(): " + element1); // Using poll() String element2 = animals.poll(); System.out.println("Using poll(): " + element2); // Using clear() animals.clear(); System.out.println("Updated LinkedBlockingQueue " + animals); ) ) 

Production

 LinkedBlockingQueue: (Chien, Chat, Cheval) Éléments supprimés: Utilisation de remove (): Chien Utilisation de sondage (): Chat Mise à jour LinkedBlockingQueue: () 

méthodes put () et take ()

Dans les processus multithreading, nous pouvons utiliser put()et take()bloquer le fonctionnement d'un thread pour le synchroniser avec un autre thread. Ces méthodes attendront jusqu'à ce qu'elles puissent être exécutées avec succès.

put (), méthode

Pour insérer l'élément spécifié à la fin d'une file d'attente de blocage liée, nous utilisons la put()méthode.

Si la file d'attente de blocage liée est pleine, elle attend qu'il y ait de l'espace dans la file d'attente de blocage liée pour insérer l'élément.

Par exemple,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( // Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Production

 LinkedBlockingQueue: (Chien, Chat) 

Ici, la put()méthode peut lancer un InterruptedExceptionsi elle est interrompue en attendant. Par conséquent, nous devons l'enfermer dans un bloc try… catch.

take (), méthode

Pour renvoyer et supprimer un élément de l'avant de la file d'attente de blocage liée, nous pouvons utiliser la take()méthode.

Si la file d'attente de blocage liée est vide, elle attend jusqu'à ce qu'il y ait des éléments dans la file d'attente de blocage liée à supprimer.

Par exemple,

 import java.util.concurrent.LinkedBlockingQueue; class Main ( public static void main(String() args) ( LinkedBlockingQueue animals = new LinkedBlockingQueue(5); try ( //Add elements to animals animals.put("Dog"); animals.put("Cat"); System.out.println("LinkedBlockingQueue: " + animals); // Remove an element String element = animals.take(); System.out.println("Removed Element: " + element); System.out.println("New LinkedBlockingQueue: " + animals); ) catch(Exception e) ( System.out.println(e); ) ) ) 

Production

 LinkedBlockingQueue: (Dog, Cat) Élément supprimé: Dog New LinkedBlockingQueue: (Cat) 

Ici, la take()méthode lancera un InterrupedExceptionsi elle est interrompue en attendant. Par conséquent, nous devons l'enfermer dans un try… catchbloc.

Autres méthodes

Méthodes Descriptions
contains(element) Recherche dans la file d'attente de blocage liée l'élément spécifié. Si l'élément est trouvé, il retourne true, sinon il retourne false.
size() Renvoie la longueur de la file d'attente de blocage liée.
toArray() Convertit la file d'attente de blocage liée en tableau et renvoie le tableau.
toString() Convertit la file d'attente de blocage liée en chaîne

Pourquoi utiliser LinkedBlockingQueue?

Le LinkedBlockingQueueutilise des listes liées comme stockage interne.

Il est considéré comme une collection thread-safe . Par conséquent, il est généralement utilisé dans les applications multi-threading.

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

Désormais, si le premier thread est plus lent que le deuxième thread, la file d'attente de blocage liée peut obliger le deuxième thread à attendre que le premier thread termine ses opérations.

Articles intéressants...