Dans ce tutoriel, nous allons en apprendre davantage sur la classe LinkedBLockingQueue et ses méthodes à l'aide d'exemples.
La LinkedBlockingQueue
classe du Collections
framework 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.LinkedBlockingQueue
package.
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 LinkedBlockingQueue
classe 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 retournefalse
si 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 retournenull
si 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 lejava.util.Iterator
package 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 retournenull
si 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 InterruptedException
si 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 InterrupedException
si elle est interrompue en attendant. Par conséquent, nous devons l'enfermer dans un try… catch
bloc.
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 LinkedBlockingQueue
utilise 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.