English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans ce tutoriel, nous allons apprendre l'interface Java BlockingQueue et ses méthodes.
L'interface BlockingQueue du cadre Java Collections étend l'interface Queue. Elle permet à toute opération de s'attendre jusqu'à ce qu'elle soit exécutée avec succès.
Par exemple, si nous devons supprimer un élément d'une file vide, la file bloquée permet à l'opération de suppression de s'attendre jusqu'à ce que la file contienne certains éléments à supprimer.
Comme BlockingQueue est une interface, nous ne pouvons pas fournir une implémentation directe.
Pour utiliser les fonctionnalités de BlockingQueue, nous devons utiliser les classes qui l'implémentent.
Nous devons importer le paquet java.util.concurrent.BlockingQueue pour utiliser BlockingQueue.
//Implémentation Array de BlockingQueue BlockingQueue<String> animal1 = new ArraryBlockingQueue<>(); //Implémentation LinkedList de BlockingQueue BlockingQueue<String> animal2 = new LinkedBlockingQueue<>();
Dans ce cas, nous créons respectivement les objets animal de la classe ArrayBlockingQueue et LinkedBlockingQueue1et animal2Ces objets peuvent utiliser les fonctionnalités de l'interface BlockingQueue.
Selon que la file est pleine ou vide, les méthodes de la file bloquée peuvent être divisées en3Classe :
add() - Insérer l'élément à la fin de la file bloquée. Si la file est pleine, lève une exception.
element() - Retourner l'élément en tête de la file bloquée. Si la file est vide, lève une exception.
remove() -Supprimer un élément de la file bloquée. Si la file est vide, lève une exception.
offer() - Insérer l'élément spécifié à la fin de la file bloquée. Si la file est pleine, retourner false.
peek() - Retourner l'élément en tête de la file bloquée. Si la file est vide, retourner null.
poll() - Supprimer un élément de la file bloquée. Si la file est vide, retourner null.
offer() et poll()Plus de contenu
offer() et poll() peuvent être utilisés avec un délai d'attente. Autrement dit, nous pouvons passer des unités de temps en tant que paramètres. Par exemple,
offer(value, 100, milliseconds)
Ici,
value est l'élément à insérer dans la file
et nous définissons le délai d'attente sur100 millisecondes
Cela signifie que la méthode offer() essaie d'insérer un élément dans la file bloquante pendant100 millisecondes. Si10Impossible d'insérer un élément en moins de 0 millisecondes, cette méthode retourne false.
Remarque :En plus des millisecondes, nous pouvons utiliser les unités de temps suivantes dans les méthodes offer() et poll() : jours, heures, minutes, secondes, microsecondes et nanosecondes.
BlockingQueue fournit également des méthodes pour bloquer les opérations et attendre, si la file est pleine ou vide.
put() - Insérer un élément dans la file bloquante. Si la file est pleine, elle attendra jusqu'à ce qu'il y ait de la place pour insérer l'élément.
take() - Supprimer et renvoyer un élément de la file bloquante. Si la file est vide, elle attendra jusqu'à ce qu'il y ait un élément à supprimer dans la file.
Supposons que nous voulions insérer un élément dans la file. Si la file est pleine, la méthode put() attendra jusqu'à ce que la file ait de la place pour insérer l'élément.
De même, si nous voulons supprimer un élément de la file. Si la file est vide, la méthode take() attendra jusqu'à ce que la file contienne l'élément à supprimer.
import java.util.concurrent.BlockingQueue; import java.util.concurrent.ArrayBlockingQueue; class Main { public static void main(String[] args) { //Créer une file bloquante en utilisant ArrayBlockingQueue BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(5); try { //Insérer un élément dans la file bloquante numbers.put(2); numbers.put(1); numbers.put(3); System.out.println("FileBloquante: " + numbers); //Supprimer un élément de la file bloquante int removedNumber = numbers.take(); System.out.println("Removed Number: ") + removedNumber); } catch(Exception e) { e.getStackTrace(); } } }
Output result
BlockingQueue: [2, 1, 3] Removed Element: 2
To learn more about ArrayBlockingQueue, please visitJava ArrayBlockingQueue.
In Java, BlockingQueue is consideredThread-safeCollection. This is because it may be helpful in multi-threaded operations.
Suppose one thread is inserting elements into the queue, while another thread is deleting elements from the queue.
Now, if the first thread runs slower, the blocking queue can make the second thread wait until the first thread completes its operation.