L'interface de file d'attente est au même niveau que la liste et le jeu, et héritent les deux de l'interface de collecte. LinkedList implémente l'interface de file d'attente. L'interface de file d'attente rétrécit l'accès à la méthode LinkedList (c'est-à-dire que si le type de paramètre dans la méthode est une file d'attente, il ne peut accéder aux méthodes définies par l'interface de la file d'attente et ne peut pas accéder directement aux méthodes non courantes de la liste Linked), afin que seule la méthode appropriée puisse être utilisée. BlockingQueue hérite de l'interface de file d'attente.
Une file d'attente est une structure de données. Il a deux opérations de base: l'ajout d'un élément à la fin de la file d'attente, et la suppression d'un élément de la tête de la file d'attente signifie que la file d'attente gère les données de première manière. Si vous essayez d'ajouter un élément à une file d'attente de blocage complète ou de supprimer un métasecteur d'une file d'attente de blocage vide, cela entraînera le blocage du fil. Le blocage des files d'attente est un outil utile lors de la coopération avec plusieurs threads. Les threads de travailleur peuvent régulièrement stocker les résultats intermédiaires dans une file d'attente de blocage tandis que d'autres threads de travailleur éliminent les résultats intermédiaires et les modifient à l'avenir. La file d'attente équilibre automatiquement la charge. Si le premier jeu de threads s'exécute plus lent que le second, le deuxième jeu de threads se bloque en attendant le résultat. Si le premier jeu de threads s'exécute rapidement, il attendra que le deuxième jeu de fil se rattrape. Le tableau suivant montre les opérations des files d'attente de blocage dans JDK1.5:
Ajouter Ajouter une métaSearch Si la file d'attente est pleine, lancez une exception IIIEGAISLABEEPEPLIAN
Retirez et retournez l'élément à la tête de la file d'attente. Si la file d'attente est vide, une exception NosuchementException est lancée.
L'élément renvoie l'élément à la tête de la file d'attente. Si la file d'attente est vide, une exception NosuchementException est lancée.
Offrez Ajouter un élément et renvoie vrai si la file d'attente est pleine, retourne false
Le sondage supprime et renvoie l'élément dans la tête de la file d'attente. Si la file d'attente est vide, retournez null.
Peek renvoie l'élément à la tête de la file d'attente. Si la file d'attente est vide, retournez null
Mettez ajouter un élément si la file d'attente est pleine, bloquant
Prenez supprimer et retournez l'élément à la tête de la file d'attente. Si la file d'attente est vide, les blocs
Supprimer, élément, offrir, sonder et jeter un coup d'œil à l'interface de file d'attente.
Les opérations qui bloquent les files d'attente peuvent être divisées en les trois catégories suivantes en fonction de leurs réponses: AAD, Supprimer et les opérations d'éléments lancent des exceptions lorsque vous essayez d'ajouter des éléments à une file d'attente complète ou d'obtenir des éléments d'une file d'attente vide. Bien sûr, dans un programme multithread, la file d'attente peut devenir complète ou vide à tout moment, vous pouvez donc utiliser l'offre, le scrutin et les méthodes PEEK. Ces méthodes donnent simplement un message d'erreur lorsque la tâche ne peut pas être terminée sans lancer une exception.
Remarque: les erreurs des méthodes d'interrogation et de coupure et de retour null. Par conséquent, il est illégal d'insérer une valeur nulle dans la file d'attente.
Il existe également des variantes d'offre et de méthode de sondage avec les délais d'expiration, par exemple, les appels suivants:
Boolean Success = Q.OFFER (X, 100, TimeUnit.Millisecondes);
Essayez d'insérer un élément dans la queue de la file d'attente en 100 millisecondes. En cas de succès, revenez vrai immédiatement; Sinon, lorsque le délai d'attente est atteint, revenez faux. De même, appelez:
Head object = q.poll (100, timeunit.milliseconds);
Si l'élément d'en-tête de file d'attente est retiré avec succès dans les 100 millisecondes, l'élément d'en-tête est renvoyé immédiatement; Sinon, Null est retourné lorsque le délai d'attente est atteint.
Enfin, nous avons des opérations de blocage en place et en prenant. La méthode de put bloque lorsque la file d'attente est pleine et que la méthode Take bloque lorsque la file d'attente est vide.
Le package java.ulil.concurrent fournit 4 variantes de files d'attente de blocage. Par défaut, la capacité de LinkedBlockingQueue n'est pas une limite supérieure (elle est inexacte. La capacité est entière.max_value lorsqu'elle n'est pas spécifiée. Si ce n'est pas le cas, comment peut-il être bloqué lors de la place), mais vous pouvez également choisir de spécifier sa capacité maximale. Il s'agit d'une file d'attente basée sur une liste liée, qui trie les éléments de FIFO (First in First Out).
ArrayBlockingQueue doit spécifier la capacité pendant la construction, et vous pouvez choisir si l'équité est requise. Si le paramètre FAIL est défini, le fil avec le plus de temps d'attente sera d'abord traité (en fait, cette équité est obtenue en définissant RentrantLock sur true: c'est-à-dire que le fil avec le plus long temps d'attente fonctionnera en premier). En règle générale, l'équité peut vous coûter des performances et l'utiliser uniquement lorsqu'elle est vraiment nécessaire. Il s'agit d'une file d'attente de boucle de blocage basée sur une table qui trie les éléments selon le principe FIFO (premier dans First Out).
PriorityBlockingQueue est une file d'attente avec priorité, pas une file d'attente au premier entrée. Les éléments sont supprimés dans l'ordre prioritaire, et la file d'attente n'a pas de limite supérieure (j'ai examiné le code source. PriorityBlockingQueue est une réchauffage de PriorityQueue, qui est basée sur la structure de données du tas. Priorityqueue n'a pas de limite de capacité, tout comme ArrayList, il ne sera donc pas bloqué lorsque La ressource étant épuisée), mais si la file d'attente est vide, la prise de fonctionnement de l'élément se bloque, de sorte que son opération de recherche est bloquée. De plus, les éléments entrant dans la file d'attente doivent avoir des capacités comparatives.
Enfin, DelayQueue (implémenté en fonction de PriorityQueue) est une file d'attente de blocage illimitée qui stocke les éléments retardés, et les éléments ne peuvent être extraits que lorsque le retard expire. La tête de cette file d'attente est l'élément retardé avec le temps de stockage le plus long après l'expiration du retard. Si aucun des retards n'a expiré, la file d'attente n'a aucun en-têtes et le scrutin ne reviendra NULL. Lorsque la méthode GetDelay (timeunit.nanoseconds) d'un élément renvoie une valeur inférieure ou égale à zéro, l'expiration se produit et le volet supprime l'élément. Cette file d'attente n'autorise pas les éléments nuls. Voici l'interface de retard:
Code java
L'interface publique retardée étend comparable <layed> {long getdelay (timeunit unit); }L'élément qui place DelayQueue implémentera également la méthode compareto, qui l'utilise pour trier les éléments.
L'exemple suivant montre comment utiliser une file d'attente de blocage pour contrôler un ensemble de threads. Le programme recherche tous les fichiers dans un seul répertoire et tous ses sous-répertoires, et imprime une liste de fichiers contenant les mots clés spécifiés. Comme le montrent les exemples suivants, les deux avantages significatifs de l'utilisation des files d'attente de blocage sont les suivants: le fonctionnement multi-thread des files d'attente communs ne nécessite pas de synchronisation supplémentaire. De plus, la file d'attente équilibre automatiquement la charge, c'est-à-dire que si le traitement (les deux côtés de la production et de la consommation) est traité rapidement, il sera bloqué, réduisant ainsi l'écart de vitesse de traitement entre les deux côtés. Ce qui suit est la mise en œuvre spécifique:
Code java
classe publique BlockingQueUeTest {public static void main (String [] args) {scanner dans = new Scanner (System.in); System.out.print ("Entrez le répertoire de base (par exemple /usr/local/jdk5.0/src):"); String Directory = in.NextLine (); System.out.print ("Entrez le mot-clé (par exemple volatile):"); String Keyword = in.NextLine (); Final int file_queue_size = 10; // Blocking Taille de la file d'attente final int search_threads = 100; // Nombre de threads de recherche de mots clés // Blocking Queue Basé sur ArrayBlockingQueueBlockingQueue <Fichier> Queue = new ArrayBlockingQueue <File> (file_queue_size); // Démarrer un seul thread pour rechercher le répertoire FileEnumerationTask enUmerator = new FileEnumerationTask (file d'attente, nouveau fichier (répertoire)); Nouveau thread (énumerateur) .start (); // Démarrer 100 threads pour rechercher le mot-clé spécifié dans le fichier pour (int i = 1; i <= search_threads; i ++) nouveau thread (new SearchTask (file d'attente, mot-clé)). Start (); }} classe FileEnumerationTask implémente Runnable {// L'objet Dumb Metafile est placé à la fin de la file d'attente de blocage pour indiquer que le fichier a été traversé le fichier statique public Dummy = nouveau fichier (""); file d'attente privée BlockerEue <Fichier>; Fichier privé StartDirectory; Public FileEnumerationTask (BlockingQueue <Fichier> File, fichier startDirectory) {this.queue = file d'attente; this.startingDirectory = startDirectory; } public void run () {try {enumerate (startDirectory); queue.put (mannem); // exécuter ici pour indiquer que le fichier dans le répertoire spécifié a été traversé} catch (InterruptedException e) {}} // mettez tous les fichiers dans le répertoire spécifié dans la file d'attente de blocs en tant que fichiers de fichiers en énumérat de fichier (lique répertoire); pour (fichier de fichier: fichiers) {if (file.isdirectory ()) enumerat (fichier); else // Mettez l'élément à la fin de la file d'attente. Si la file d'attente est complète, Block Queue.put (fichier); }}} class SearchTask implémente runnable {private blockingQueue <File> file d'attente; mot-clé de chaîne privée; Public SearchTask (BlockingQueue <Fichier> Queue, mot-clé String) {this.queue = file d'attente; this.keyword = mot-clé; } public void run () {try {boolean Done = false; tandis que (! fait) {// récupérer le premier élément de la file d'attente. Si la file d'attente est vide, Block File File = Queue.Take (); if (file == fileenumerationtask.dummy) {// le récupérer et le mettre de manière à ce que d'autres threads se terminent rapidement lors de la lecture de sa queue.put (fichier); fait = true; } else search (fichier); }} catch (ioException e) {e.printStackTrace (); } catch (InterruptedException e) {}} public void search (fichier file) lève ioException {Scanner in = new Scanner (new FileInputStream (fichier)); int lineNumber = 0; while (in.hasnextline ()) {lineNumber ++; String line = in.NextLine (); if (line.contains (mot clé)) System.out.printf ("% s:% d:% s% n", file.getPath (), linenumber, line); } in.close (); }} Lien original: http://www.cnblogs.com/end/archive/2012/10/25/2738493.html
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.