Java Language BlockingQueue


Exemple

Une BlockingQueue est une interface, qui est une file d'attente qui se bloque lorsque vous essayez de retirer la file d'attente de celle-ci et que la file d'attente est vide ou si vous essayez de mettre les éléments en file d'attente et que la file d'attente est déjà pleine. Un thread essayant de se libérer de la file d'attente vide est bloqué jusqu'à ce qu'un autre thread insère un élément dans la file d'attente. Un thread qui tente de mettre en file d'attente un élément dans une file d'attente complète est bloqué jusqu'à ce qu'un autre thread crée de l'espace dans la file d'attente, soit en retirant un ou plusieurs éléments ou en effaçant complètement la file d'attente.

Les méthodes de BlockingQueue se présentent sous quatre formes, avec différentes manières de gérer les opérations qui ne peuvent pas être satisfaites immédiatement, mais qui peuvent être satisfaites à l’avenir: on jette une exception, la seconde renvoie une valeur spéciale (nulle ou fausse selon opération), le troisième bloque indéfiniment le thread en cours jusqu’à ce que l’opération réussisse, et le quatrième ne bloque qu’une limite de temps maximale donnée avant d’abandonner.

Opération Jette une exception Valeur Spéciale Blocs Le temps est écoulé
Insérer ajouter() offre (e) mettre (e) offre (e, temps, unité)
Retirer retirer() sondage() prendre() sondage (heure, unité)
Examiner élément() peek () N / A N / A

Un BlockingQueue peut être limité ou non . Un BlockingQueue borné est un qui est initialisé avec une capacité initiale.

BlockingQueue<String> bQueue = new ArrayBlockingQueue<String>(2);

Tout appel à une méthode put () sera bloqué si la taille de la file d'attente est égale à la capacité initiale définie.

Une file d'attente illimitée est une file qui est initialisée sans capacité, en fait, par défaut, elle est initialisée avec Integer.MAX_VALUE.


Les implémentations courantes de BlockingQueue sont les suivantes:

  1. ArrayBlockingQueue
  2. LinkedBlockingQueue
  3. PriorityBlockingQueue

Regardons maintenant un exemple de ArrayBlockingQueue :

BlockingQueue<String> bQueue = new ArrayBlockingQueue<>(2);
bQueue.put("This is entry 1");
System.out.println("Entry one done");
bQueue.put("This is entry 2");
System.out.println("Entry two done");
bQueue.put("This is entry 3");
System.out.println("Entry three done");

Cela va imprimer:

Entry one done
Entry two done

Et le thread sera bloqué après la deuxième sortie.