Heim > Java > javaLernprogramm > Hauptteil

Zusammenfassung der Java-Warteschlangennutzung

高洛峰
Freigeben: 2016-12-01 13:17:49
Original
1164 Leute haben es durchsucht

Warteschlangenübersicht

Zusammenfassung der Java-Warteschlangennutzung

Wie in der Abbildung gezeigt, stellt das JDK zwei Implementierungssätze für gleichzeitige Warteschlangen bereit. Eine davon ist eine nicht blockierende Hochleistungswarteschlange, die durch ConcurrentLinkedQueue dargestellt wird. Eine davon ist die Blockierungswarteschlange, die durch die BlockingQueue-Schnittstelle dargestellt wird, unabhängig davon, welcher Typ von Queue geerbt wird. Eine Warteschlange, die einen Blockierungsalgorithmus verwendet, kann mit einer Sperre (die gleiche Sperre wird zum Einreihen und Entfernen aus der Warteschlange verwendet) oder mit zwei Sperren (unterschiedliche Sperren werden zum Einreihen und Entfernen aus der Warteschlange verwendet) implementiert werden eine Möglichkeit, die wir im Folgenden einzeln analysieren werden.



ConcurrentLinkedQueue

Eine Warteschlange, die durch eine sperrenfreie Methode (CAS+volatile) für Szenarien mit hoher Parallelität geeignet ist. , wodurch eine hohe Leistung bei hoher Parallelität erzielt wird. ConcurrentLinkedQueue schneidet normalerweise besser ab als BlockingQueue.

Es handelt sich um eine unbegrenzte Thread-sichere Warteschlange, die auf dem First-In-First-Out-Prinzip basiert. Der Kopf wird zuerst hinzugefügt, und der Schwanz ist der zuletzt hinzugefügte Nullpunkt Elemente dürfen nicht hinzugefügt werden.

Beachten Sie, dass add()/offer() beide Methoden zum Hinzufügen von Elementen sind. Hier gibt es keinen Unterschied. poll()/peek() sind Methoden zum Entfernen des Kopfelements. Der Unterschied besteht darin, dass poll gelöscht wird Elemente, während peek nicht treffen.

Es ist wichtig zu beachten, dass die Methode zum Erhalten der Warteschlangengröße aufgrund ihrer nicht blockierenden Natur im Gegensatz zu anderen gewöhnlichen Sammlungen keine konstante Zeit, sondern O(N) kostet, also sollten wir es versuchen Unser Bestes: Es ist möglich, die Verwendung der size()-Methode zu vermeiden und stattdessen die Verwendung von isEmpty() in Betracht zu ziehen.

Obwohl der CAS+VOLATILE-Mechanismus zur Vermeidung von Sperren verwendet wird, müssen wir verstehen, dass dies nur die Sicherheit einer einzelnen Operation wie peek() gewährleistet, aber wenn Sie die Sicherheit von gewährleisten möchten Bei mehreren Vorgängen müssen Sie den Sperrmechanismus verwenden, um einen Synchronisationseffekt zu erzielen.



BlockingQueue API

Betreten Sie die Warteschlange:

Angebot( E e): Wenn die Warteschlange nicht voll ist, geben Sie sofort true zurück. Wenn die Warteschlange voll ist, geben Sie sofort false zurück.

Put(E e): Wenn die Warteschlange voll ist, blockieren Sie bis Das Array ist voll Oder der Thread ist unterbrochen-->Blockiert

offer(E e, long timeout, TimeUnit unit): Fügen Sie ein Element am Ende der Warteschlange ein. Wenn das Array voll ist, warten Sie bis die Wartezeit läuft ab


Warteschlange entfernen:

poll(): Nicht blockierende Daten übernehmen, sofort zurückgeben

take (): Blockieren der Datenerfassung

Umfrage (lange Zeitüberschreitung, TimeUnit-Einheit): Abfrage mit einer bestimmten Zeitüberschreitung, um Daten abzurufen



ArrayBlockingQueue

Die Array-basierte Blockierungswarteschlangenimplementierung verwaltet intern ein Array fester Länge, um die Datenobjekte in der Warteschlange zwischenzuspeichern. Da es nur ein Sperrobjekt (ReentrantLock) innerhalb der ArrayBlockingQueue gibt, Es gibt keine Trennung von Lesen und Schreiben, was bedeutet, dass Produktion und Konsum nicht vollständig parallel sein können. Da die Länge definiert werden muss, wird sie auch als begrenzte Warteschlange bezeichnet.



LinkedBlockingQueue

Eine Blockierungswarteschlangenimplementierung basierend auf einer verknüpften Liste, ähnlich wie ArrayBlockingQueue, die auch verwaltet wird intern Eine Datenpufferwarteschlange (bestehend aus einer verknüpften Liste).

Der Grund, warum LinkedBlockingQueue gleichzeitige Daten effizienter verarbeitet als ArrayBlockingQueue, liegt darin, dass die interne Implementierung zwei Sperren verwendet, was bedeutet, dass die Warteschlange separat gesperrt ist und die Warteschlange separat gesperrt ist, dh das Lesen und Schreiben erfolgt getrennt, so dass der Produzent und der Verbraucher eine vollständige Parallelität erreichen.

Die Länge muss nicht definiert werden, auch unbegrenzte Warteschlange genannt. Wenn die Länge nicht definiert ist, müssen Sie natürlich auf die Geschwindigkeit des Produzenten und die Geschwindigkeit des Verbrauchers achten, da die Warteschlangenlänge standardmäßig Integer.MAX_VALUE beträgt.



SynchronousQueue

Eine ungepufferte Warteschlange, die vom Produzenten erzeugten Daten werden direkt gespeichert Von Verbrauchern erhalten und konsumiert. Da es sich um eine leichtgewichtige Blockierwarteschlange handelt, kann sie im Hinblick auf die Nutzung nur von einem Thread verwendet werden, der das Abrufen von Elementen blockiert und darauf wartet, dass ein anderer Thread ein Element in die Warteschlange stellt Wird sofort vom wartenden Thread abgerufen und implementiert tatsächlich einen einfachen Einzelelementaustausch zwischen Threads.



PriorityBlockingQueue

Prioritätsbasierte Blockierungswarteschlange (die Priorität wird über den Konstruktor übergeben. Bestimmt durch das Compator-Objekt, d. h. das an die Warteschlange übergebene Objekt muss die Comparable-Schnittstelle implementieren).

Bei der Implementierung von PriorityBlockingQueue verwendet die interne Steuerungs-Thread-Synchronisationssperre eine faire Sperre, bei der es sich ebenfalls um eine unbegrenzte Warteschlange handelt.

Um es für den Laien auszudrücken: Es handelt sich nicht um eine „First-in-first-out“-Warteschlange, sondern wer die niedrigere Priorität hat, kommt zuerst raus. So können Sie darüber nachdenken, ob jedes Inserat/Angebot sortiert wird? Müssen wir sie alle nach Priorität sortieren? Tatsächlich können Sie einen groben Blick auf die Add/Take-Methode werfen und die Designidee von PriorityBlockingQueue verstehen: Beim Hinzufügen wird keine Sortierung durchgeführt. Wählen Sie beim Nehmen einfach die Methode mit der niedrigsten Priorität aus und nehmen Sie sie heraus Dadurch wird vermieden, dass das Sortieren beim Hinzufügen Zeit in Anspruch nimmt, es spart jedoch Zeit beim Aufnehmen, da nicht vollständig sortiert wird, sondern nur ein Element mit niedriger Priorität ausgewählt wird.



DelayQueue

Warteschlange mit Verzögerungszeit. Das darin enthaltene Element kann erst nach Ablauf der angegebenen Verzögerungszeit aus der Warteschlange abgerufen werden. Die Elemente in der Warteschlange müssen die verzögerte Schnittstelle implementieren und es gibt keine Größenbeschränkung. Im Wesentlichen wird es mit Hilfe von PriorityBlockingQueue implementiert, wobei die Verzögerungszeit Priorität hat. Es gibt viele Anwendungsszenarien für Verzögerungswarteschlangen, z. B. das Entfernen abgelaufener zwischengespeicherter Daten, Zeitüberschreitungen bei der Verarbeitung von Aufgaben, das Schließen inaktiver Verbindungen usw.


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage