Die Warteschlangenschnittstelle befindet sich auf der gleichen Ebene wie List und Set und erbt beide die Sammlungsschnittstelle. LinkedList implementiert die Warteschlangenschnittstelle. Die Warteschlangenschnittstelle verengt den Zugriff auf die LinkedList-Methode (dh wenn der Parametertyp in der Methode eine Warteschlange ist, kann nur auf die von der Warteschlangenschnittstelle definierten Methoden zugreifen und nicht direkt auf die Nichtqueue-Methoden der LinkedList zugreifen), sodass nur die entsprechende Methode verwendet werden kann. Blockingqueue erbt die Warteschlangenschnittstelle.
Eine Warteschlange ist eine Datenstruktur. Es verfügt über zwei grundlegende Operationen: Hinzufügen eines Elements am Ende der Warteschlange und Entfernen eines Elements vom Kopf der Warteschlange bedeutet, dass die Warteschlange Daten in erstmaliger Weise verwaltet. Wenn Sie versuchen, einer vollblockierenden Warteschlange ein Element hinzuzufügen oder einen Metasektor aus einer leeren blockierenden Warteschlange zu entfernen, wird der Faden blockiert. Das Blockieren von Warteschlangen ist ein nützliches Werkzeug, wenn Sie mit mehreren Threads zusammenarbeiten. Worker -Threads können regelmäßig Zwischenergebnisse in einer blockierenden Warteschlange speichern, während andere Worker -Threads Intermediate -Ergebnisse herausnehmen und diese in Zukunft ändern. Die Warteschlange gleicht die Last automatisch aus. Wenn der erste Thread -Set langsamer als der zweite läuft, blockiert der zweite Thread -Set, während er auf das Ergebnis wartet. Wenn der erste Thread -Set schnell ausgeführt wird, wartet er, bis der zweite Thread -Set aufholte. Die folgende Tabelle zeigt die Operationen der Blockierung von Warteschlangen in JDK1.5:
Fügen Sie eine MetaSearch hinzu, wenn die Warteschlange voll ist, werfen Sie eine Ausnahme von IIiegaiIsLabeepeplian aus
Entfernen Sie das Element am Kopf der Warteschlange entfernen und geben Sie sie zurück. Wenn die Warteschlange leer ist, wird eine NoSuchelementException -Ausnahme ausgelöst.
Element gibt das Element am Kopf der Warteschlange zurück. Wenn die Warteschlange leer ist, wird eine NoSuchelementException -Ausnahme ausgelöst.
Fügen Sie ein Element hinzu und gibt true zurück, wenn die Warteschlange voll ist.
Die Umfrage entfernt und gibt das Element im Kopf der Warteschlange zurück. Wenn die Warteschlange leer ist, geben Sie NULL zurück.
Peek gibt das Element am Kopf der Warteschlange zurück. Wenn die Warteschlange leer ist, geben Sie NULL zurück
Fügen Sie ein Element hinzu, wenn die Warteschlange voll ist und blockiert
Entfernen Sie das Element am Kopf der Warteschlange. Wenn die Warteschlange leer ist, Blöcke
Entfernen, Elemente, Angebot, Umfrage und Peek gehören tatsächlich zur Warteschlangenschnittstelle.
Operationen, in denen Warteschlangen blockiert werden können, können gemäß ihren Antworten in die folgenden drei Kategorien unterteilt werden: AAD, REMETEE und Elementoperationen machen Ausnahmen, wenn Sie versuchen, Elemente zu einer vollständigen Warteschlange hinzuzufügen oder Elemente aus einer leeren Warteschlange zu erhalten. Natürlich kann die Warteschlange in einem Multithread -Programm jederzeit voll oder leer werden, sodass Sie das Angebot, die Umfrage, die Peek -Methoden verwenden möchten. Diese Methoden geben einfach eine Fehlermeldung an, wenn die Aufgabe ohne Ausnahme nicht ausgeführt werden kann.
HINWEIS: POLL- UND PEEK -METHODEN FEHLER UND NULL RETUCT NULL. Daher ist es illegal, einen Nullwert in die Warteschlange einzufügen.
Es gibt auch Angebots- und Umfragemethodenvarianten mit Timeouts, z. B. die folgenden Anrufe:
Boolean Erfolg = q.Offer (x, 100, TimeUnit.Millisekunden);
Versuchen Sie, ein Element in den Schwanz der Warteschlange in 100 Millisekunden einzufügen. Wenn er erfolgreich ist, kehren Sie sofort wahr zurück; Andernfalls kehren Sie beim Erreichen des Zeitlimits falsch zurück. In ähnlicher Weise rufen Sie an:
Object Head = Q.poll (100, TimeUnit.Milliseconds);
Wenn das Queue -Header -Element innerhalb von 100 Millisekunden erfolgreich entfernt wird, wird das Header -Element sofort zurückgegeben. Andernfalls wird Null zurückgegeben, wenn die Zeitüberschreitung erreicht ist.
Schließlich haben wir Blockiervorgänge ein und nehmen. Die Put -Methode blockiert, wenn die Warteschlange voll ist, und die Methode blockiert, wenn die Warteschlange leer ist.
Das Java.ulil.Concurrent -Paket bietet 4 Varianten blockierender Warteschlangen. Standardmäßig ist die Kapazität von Linked BlockingQueue nicht die obere Grenze (sie ist ungenau. Die Kapazität ist ganzzahlig.max_Value, wenn nicht angegeben. Es handelt sich um eine Warteschlange, die auf einer verknüpften Liste basiert, die Elemente nach FIFO sortiert (zuerst zuerst).
ArrayBlockingQueue muss die Kapazität während des Baus angeben, und Sie können wählen, ob Fairness erforderlich ist. Wenn der faire Parameter wahr ist, wird der Thread mit der längsten Wartezeit zuerst verarbeitet (in der Tat wird diese Fairness erreicht, indem wieder eingerichtet auf wahr ist: Das heißt, der Thread mit der längsten Wartezeit wird zuerst funktionieren). Normalerweise kann Fairness Ihre Leistung kosten und sie nur verwenden, wenn es wirklich notwendig ist. Es handelt sich um eine Array-basierte Blockierungsschlaufe-Warteschlange, die Elemente nach dem FIFO-Prinzip (zuerst im ersten Out) sortiert.
PriorityBlockingQueue ist eine Warteschlange mit Priorität und keine erste Warteschlange. Die Elemente werden in Prioritätsreihenfolge entfernt, und die Warteschlange hat keine Obergrenze (ich habe den Quellcode angesehen. PriorityBlockingqueue ist ein Umschlag von Prioritätsqueue, der auf der HEAP-Datenstruktur basiert. Prioritätsqueue hat keine Kapazitätsgrenze, nur wie Arraylist, sodass es nicht blockiert ist, wenn eine Prioritätsblockade eine add-add-add-add-add-adding-add-adding-adds-adding-adds-adds addtely ist. OutofMemoryError wegen der erschöpften Ressource), aber wenn die Warteschlange leer ist, wird die Operation des Elements blockiert, sodass die Suchoperation blockiert wird. Darüber hinaus müssen die Elemente, die in die Warteschlange eintreten, vergleichende Fähigkeiten haben.
Schließlich ist DelayQueue (implementiert auf Prioritätsqueue) eine unbegrenzte Blockierungswarteschlange, die verzögerte Elemente speichert, und Elemente können nur extrahiert werden, wenn die Verzögerung abläuft. Der Kopf dieser Warteschlange ist das verzögerte Element mit der längsten Speicherzeit nach Ablauf der Verzögerung. Wenn keiner der Verzögerungen abgelaufen ist, hat die Warteschlange keine Header und die Umfrage wird null zurückgegeben. Wenn die Methode GetDelay (TimeUnit.Nanoseconds) eines Elements einen Wert weniger als oder gleich Null zurückgibt, erfolgt der Ablauf und die Umfrage wird das Element beseitigt. Diese Warteschlange erlaubt keine Nullelemente. Hier ist die Verzögerungsschnittstelle:
Java -Code
Die öffentliche Schnittstelle verzögert erweitert vergleichbar <verzögert> {Long getDelay (Zeiteinheit); }Das Element, das DelayQueue ausgeht, wird auch die Vergleichsmethode implementieren, mit der dies die Elemente sortiert.
Das folgende Beispiel zeigt, wie eine blockierende Warteschlange verwendet wird, um einen Thread -Set zu steuern. Das Programm sucht nach allen Dateien in einem Verzeichnis und allen Subdirektorien und druckt eine Liste von Dateien aus, die die angegebenen Schlüsselwörter enthalten. Wie aus den folgenden Beispielen hervorgeht, sind die beiden wesentlichen Vorteile der Verwendung der Blockierung von Warteschlangen: Multi-Threaded-Betrieb gemeinsamer Warteschlangen erfordern keine zusätzliche Synchronisation. Darüber hinaus wird die Warteschlange automatisch die Last ausgleichen, dh wenn die Verarbeitung (beide Seiten der Produktion und des Verbrauchs) schnell verarbeitet wird, wird sie blockiert, wodurch die Verarbeitungsgeschwindigkeit zwischen den beiden Seiten verringert wird. Das Folgende ist die spezifische Implementierung:
Java -Code
public class blockingqueueTest {public static void main (String [] args) {scanner in = new scanner (System.in); System.out.print ("Basisverzeichnis eingeben (eg /usr/local/jdk5.0/src):"); String Directory = in.Nextline (); System.out.print ("Schlüsselwort eingeben (z. B. volatil):"); String keyword = in.nextline (); endgültige int File_queue_size = 10; // Blockierung der Warteschlangengröße endgültig int Search_threads = 100; // Anzahl der Schlüsselwort -Such -Threads // Blockieren von Warteschlangen basierend auf ArrayBlockingQueuBlockingQueue <Datei> queue = new ArrayBlockingQueue <Datei> (File_queue_size); // Nur einen Thread starten, um die Verzeichnis FileEnumerationTask Enumerator = new FileEnumerationTask (Queue, neue Datei (Verzeichnis)) zu durchsuchen; neuer Thread (Enumerator) .Start (); // 100 Threads starten, um nach dem angegebenen Schlüsselwort in der Datei für (int i = 1; i <= search_threads; i ++) neuer Thread (New SearchTask (Queue, Schlüsselwort)) zu suchen. }} class FileEnumerationTask implementiert runnable {// Das dumme Metafile -Objekt wird am Ende der blockierenden Warteschlange platziert, um anzuzeigen, dass die Datei die öffentliche statische Datei Dummy = New Datei durchquert wurde (""); private Blockingqueue <Datei> Warteschlange; private Datei -Startdirektorie; public FileEnumerationTask (BlockingQueue <Datei> Warteschlange, Dateistart -Verzeichnis) {this.queue = Queue; this.StartingDirectory = StartDirectory; } public void run () {try {enumerate (startDirectory); queue.put (Dummy); // Hier ausführen, um anzuzeigen, dass die Datei im angegebenen Verzeichnis durchquert wurde. für (Dateidatei: Dateien) {if (file.isdirectory ()) Enumerate (Datei); sonst // setzen Sie das Element an das Ende der Warteschlange. Wenn die Warteschlange voll ist, blockieren Sie Warteschlange.put (Datei); }}} class SearchTask implementiert runnable {private blockingQueue <Datei> Warteschlange; privates Zeichenfolgenschlüsselwort; public searchTask (BlockingQueue <Datei> Warteschlange, String -Schlüsselwort) {this.queue = queue; this.keyword = keyword; } public void run () {try {boolean done = false; while (! Done) {// das erste Element der Warteschlange herausholen. Wenn die Warteschlange leer ist, blockieren Sie die Datei blockieren = queue.take (); if (file == FileEnumerationTask.dummy) {// Fügen Sie es aus und setzen Sie es ein, damit andere Threads beim Lesen von Queue.put (Datei) schnell enden; fertig = wahr; } else Suche (Datei); }} catch (ioException e) {e.printstacktrace (); } catch (InterruptedException e) {}} public void Search (Dateidatei) löscht IOException {scanner in = neuer Scanner (neuer FileInputStream (Datei)); int lineenumber = 0; while (in.hasnextline ()) {linenumber ++; String line = in.nextline (); if (line.contains (keyword) system.out.printf ("%s:%d:%s%n", file.getPath (), linenumber, line); } in.close (); }} Original -Link: http://www.cnblogs.com/end/archive/2012/10/25/2738493.html
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.