File d'attente de blocage Java
File d'attente de blocage Java
Dans ce didacticiel, nous découvrirons l'interface Java BlockingQueue et ses méthodes.
Le BlockingQueue
interface du Java Collections
framework étend le Queue
interface. Il permet à toute opération d'attendre jusqu'à ce qu'elle puisse être effectuée avec succès.
Par exemple, si nous voulons supprimer un élément d'une file d'attente vide, la file d'attente de blocage permet à l'opération de suppression d'attendre que la file d'attente contienne des éléments à supprimer.
Classes qui implémentent BlockingQueue
Depuis BlockingQueue
est une interface, nous ne pouvons pas en fournir l'implémentation directe.
Afin d'utiliser la fonctionnalité du BlockingQueue
, nous devons utiliser des classes qui l'implémentent.
- ArrayBlockingQueue
- LinkedBlockingQueue
Comment utiliser les files d'attente de blocage ?
Il faut importer le java.util.concurrent.BlockingQueue
package afin d'utiliser BlockingQueue
.
// Array implementation of BlockingQueue
BlockingQueue<String> animal1 = new ArraryBlockingQueue<>();
// LinkedList implementation of BlockingQueue
BlockingQueue<String> 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 du 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.
Plus d'informations sur l'offre() et le sondage()
Le offer()
et poll()
La méthode peut être utilisée avec des délais d'attente. 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'attente de 100 millisecondes
Cela signifie le offer()
la méthode essaiera d'insérer un élément dans la file d'attente de blocage pour 100
millisecondes. Si l'élément ne peut pas être inséré en 100 millisecondes, la méthode renvoie false
.
Remarque : Au lieu de milliseconds
, nous pouvons également utiliser ces unités de temps :days
, hours
, minutes
, seconds
, microseconds
et nanoseconds
en 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, il attendra que la file d'attente dispose d'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, il attendra jusqu'à ce que la file d'attente ait 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 alors le put()
attendra que la file d'attente dispose d'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 alors le take()
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<Integer> 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();
}
}
}
Sortie
BlockingQueue: [2, 1, 3] Removed Element: 2
Pour en savoir plus sur ArrayBlockingQueue
, visitez Java ArrayBlockingQueue.
Pourquoi BlockingQueue ?
En Java, BlockingQueue
est considéré comme le thread-safe le recueil. C'est parce qu'il 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.
Désormais, 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.
Java