Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Java

Maîtriser Java LinkedBlockingQueue : Guide Complet et Exemples

Java LinkedBlockingQueue

Explorez la classe LinkedBlockingQueue, ses méthodes principales et des exemples réels pour débloquer la file thread-safe en Java.

La classe LinkedBlockingQueue, partie du package java.util.concurrent de Java, implémente une file de blocage appuyée par une liste chaînée. Elle conforme à l'interface BlockingQueue, fournissant une structure robuste et thread-safe pour les scénarios producteur-consommateur concurrents.


Création d'un LinkedBlockingQueue

Pour utiliser cette file, importez java.util.concurrent.LinkedBlockingQueue :

import java.util.concurrent.LinkedBlockingQueue;

1. Sans Capacité Initiale

LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>();

La capacité par défaut est Integer.MAX_VALUE (231–1), rendant la file effectivement non-bornée.

2. Avec une Capacité Spécifiée

LinkedBlockingQueue<Type> queue = new LinkedBlockingQueue<>(int capacity);

Exemple :

// File de chaînes avec capacité 5
LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
// File d'entiers avec capacité 5
LinkedBlockingQueue<Integer> ages = new LinkedBlockingQueue<>(5);

Note : La capacité est optionnelle ; l'omettre crée une file non-bornée.


Méthodes Clés de LinkedBlockingQueue

La classe implémente toutes les méthodes de BlockingQueue, permettant l'insertion, la récupération et la suppression d'éléments. Deux méthodes – put() et take() – fournissent le comportement de blocage qui distingue cette file des files standards.

Insérer des Éléments

Exemple :

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

Sortie

LinkedBlockingQueue: [Dog, Cat, Horse]

Accéder aux Éléments

Exemple :

import java.util.concurrent.LinkedBlockingQueue;
import java.util.Iterator;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
        String head = animals.peek();
        System.out.println("Élément Accédé: " + head);
        Iterator<String> it = animals.iterator();
        System.out.print("Éléments LinkedBlockingQueue: ");
        while (it.hasNext()) {
            System.out.print(it.next() + ", ");
        }
    }
}

Sortie

LinkedBlockingQueue: [Dog, Cat, Horse] Élément Accédé: Dog Éléments LinkedBlockingQueue: Dog, Cat, Horse, 

Supprimer des Éléments

Exemple :

import java.util.concurrent.LinkedBlockingQueue;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Horse");
        System.out.println("LinkedBlockingQueue: " + animals);
        String removed = animals.remove();
        System.out.println("Avec remove(): " + removed);
        String polled = animals.poll();
        System.out.println("Avec poll(): " + polled);
        animals.clear();
        System.out.println("LinkedBlockingQueue Mis à Jour: " + animals);
    }
}

Sortie

LinkedBlockingQueue: [Dog, Cat, Horse] Avec remove(): Dog Avec poll(): Cat LinkedBlockingQueue Mis à Jour: []

Opérations de Blocage : put() et take()

Dans les contextes concurrents, put() et take() bloquent le thread appelant jusqu'à ce que l'opération puisse se poursuivre, assurant une coordination sûre entre producteurs et consommateurs.

put()

Insère un élément à la fin, en attendant si la file est pleine.

Exemple :

import java.util.concurrent.LinkedBlockingQueue;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        try {
            animals.put("Dog");
            animals.put("Cat");
            System.out.println("LinkedBlockingQueue: " + animals);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println(e.getMessage());
        }
    }
}

Sortie

LinkedBlockingQueue: [Dog, Cat]

take()

Récupère et supprime l'élément de tête, bloquant si la file est vide.

Exemple :

import java.util.concurrent.LinkedBlockingQueue;
public class Main {
    public static void main(String[] args) {
        LinkedBlockingQueue<String> animals = new LinkedBlockingQueue<>(5);
        try {
            animals.put("Dog");
            animals.put("Cat");
            System.out.println("LinkedBlockingQueue: " + animals);
            String removed = animals.take();
            System.out.println("Élément Supprimé: " + removed);
            System.out.println("Nouveau LinkedBlockingQueue: " + animals);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            System.err.println(e.getMessage());
        }
    }
}

Sortie

LinkedBlockingQueue: [Dog, Cat] Élément Supprimé: Dog Nouveau LinkedBlockingQueue: [Cat]

Méthodes Utilitaires Supplémentaires

MéthodeDescription
contains(Object o)Vérifie si la file contient l'élément spécifié.
size()Retourne le nombre actuel d'éléments.
toArray()Convertit la file en tableau.
toString()Fournit une représentation en chaîne de la file.

Pourquoi Choisir LinkedBlockingQueue?

Parce qu'elle utilise une liste chaînée en interne, LinkedBlockingQueue offre :

Dans les applications multithread où un thread peut produire plus lentement qu'un autre ne consomme, la file suspendra automatiquement le consommateur jusqu'à l'arrivée de nouveaux éléments, prévenant le busy-waiting et réduisant la surcharge CPU.

Pour les charges de travail concurrentes haute performance, l'API de concurrence Java recommande LinkedBlockingQueue comme structure de choix pour les pipelines producteur-consommateur.

Java

  1. Maîtriser les opérateurs Java : Types, syntaxe et exemples pratiques
  2. Commentaires Java : Types, utilisation et bonnes pratiques
  3. Maîtriser la boucle for améliorée en Java : Syntaxe, exemples et bonnes pratiques
  4. Maîtriser les chaînes de caractères en Java : Création, méthodes et bonnes pratiques
  5. Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
  6. Maîtriser les classes internes anonymes en Java : définition, syntaxe et exemples pratiques
  7. Maîtriser le try-with-resources Java : gestion automatique des ressources expliquée
  8. Annotations Java expliquées : types, placement et exemples pratiques
  9. Assertions Java : guide pratique pour détecter les bugs et assurer la fiabilité du code