Der Thread -Pool ist ein praktisches Werkzeug zum Sammeln von Aufgaben parallel. Mit der Einführung von Multi-Core-Architekturen, die für die Anwendungsparallelisierung geeignet sind, wird die Rolle von Threadpools immer deutlicher. In der ThreadPoolexecutor -Klasse und anderen Hilfsklassen führte Java 5 diesen Rahmen als Abschnitt mit neuer Parallelitätsunterstützung ein.
Das ThreadPoolexecutor -Framework ist flexibel und leistungsfähig. Es unterstützt benutzerspezifische Konfigurationen und bietet relevante Hooks und Sättigungsrichtlinien für die vollständigen Warteschlangen.
Der Java -Thread -Pool platziert die eingereichten Aufgaben zuerst in der Arbeitswarteschlange und holt sie aus der Arbeitswarteschlange (Synchronousqueue wird direkt vom Produzenten in den Arbeits -Thread eingereicht). Dann gibt es zwei Implementierungsstrategien für Arbeitswarteschlangen: unbegrenzte Warteschlangen und begrenzte Warteschlangen. Es gibt kein Problem mit der Sättigung in der unbegrenzten Warteschlange, aber das Problem ist, dass die Aufgabe, wenn die Anfrage weiterhin hoch ist, die Arbeit hirnlos in die Arbeit hinzugefügt wird, was dazu führt, dass Speicher und andere Ressourcen überlaufen oder abtasteten. Begrenzte Warteschlangen verursachen keine durch hohe Last verursachte Speicherschöpfung, aber es gibt ein Problem, wie neu eingereichte Aufgaben verwaltet werden, wenn die Arbeitswarteschlange voll ist. Dies ist das Problem, dass die Sättigungsstrategie der Thread -Pool -Warteschlangensättigung gelöst werden muss.
Sättigungsstrategien sind unterteilt in: Strategie der Abbrüche, Callerruns -Strategie, Strategie wegwerfen und die Strategie umwerfen.
Für ein besseres Verständnis habe ich ein kleines Beispiel geschrieben.
Paket Concurrency.pool; Import Java.util.Concurrent.Linked BlockingDequ; Import Java.util.Concurrent Verschiedene Sättigungsrichtlinien* @Param Handler Thread Pool Arbeit Warteschlangensättigungsrichtlinie*/öffentliche statische Hohlraumpolitik (Ablehnung von Handler) {// Es gibt 2 grundlegende Threads, die maximale Anzahl von Threads beträgt 3 und die Arbeitskapazität von 5. Threadpoolexecutor. LinkedBlockingDeque <> (5)); if (Handler! Threadpoolexecutor.abortpolicy ()); // Richtlinie ((neuer threadpoolexecutor.callerrunspolicy ()); // Politik (neuer Threadpoolexecutor.DiscardPolicy ()); // Politik (neue ThreadPoolexecutor.Discardoldestpolitic (); 0; // Task -ID public task () {id = ++ count;}@override public void run () {try {timeUnit.seconds.sleep (3); // Schlaf für 3 Sekunden} catch (interruptedException E) {System.err.println ("Thread wurde interpreted" + E.GetEnce (). " + Thread.currentThread (). GetName () +" Ausführung abgeschlossen ");}}} Wenn die Arbeitswarteschlange voll ist, werden die verschiedenen Strategien wie folgt behandelt:
1.ABORT -Richtlinie: Ausfallrichtlinie. Wenn eine neue Aufgabe eingereicht wird, wird die ungeprüfte Ausnahme direkt ausgelöst. Die Ausnahme kann vom Anrufer gefangen werden.
Fügen Sie der Hauptfunktion den folgenden Code hinzu:
Richtlinie (neuer ThreadPoolexecutor.abortPolicy ());
Das Betriebsergebnis ist:
Das Programm läuft eine Ablehnungsexecutexception aus, und insgesamt 8 Aufgaben werden ausgeführt (der Thread -Pool kann zu Beginn 3 Aufgaben ausführen, und 5 Warteschlangen werden in der Arbeitswarteschlange gespeichert). Wenn die Arbeitswarteschlange voll ist, wird eine Ausnahme direkt geworfen, und der JVM beendet nicht (ich weiß jetzt nicht warum). Wir können sehen, dass alle Threads, die Aufgaben ausführen, Threads im Thread -Pool sind.
2. Callerruns Strategie: Für den Anpassungsmechanismus geben weder Aufgaben und werfen Sie Ausnahmen, sondern lassen Sie sich auf den Anrufer zurück. Die neue Aufgabe wird nicht im Thread -Pool ausgeführt, sondern im Thread den Exector aufruft.
In der Hauptfunktion ausführen:
Richtlinie ((neuer ThreadPoolexecutor.Callerrunspolicy ()));
Auslaufergebnisse
Alle Aufgaben werden ausgeführt und 2 (10 - 3 -5) Aufgaben werden erfolgreich im Haupt -Thread ausgeführt, und 8 Aufgaben werden durch Threads im Thread -Pool ausgeführt.
3. Diskard Strategie: Neu eingereichte Aufgaben werden aufgegeben.
In der Hauptfunktion ausführen
Richtlinie (neuer threadpoolexecutor.discardpolicy ());
Die obigen Ergebnisse zeigen, dass keine Ausnahme ausgelöst wird, die 2 neuen Aufgaben, die später eingereicht wurden, verworfen werden und nur die ersten 8 (3+5) Aufgaben verarbeitet und die JVM -Ausgaben.
4. Diskardoldest -Strategie: Die Warteschlange ist die Aufgabe des "Leiters des Teams" und dann versuchen Sie, eine neue Aufgabe einzureichen. (Nicht geeignet für Arbeitskräfte -Warteschlangen als vorrangige Warteschlangen)
Führen Sie die folgende Methode in der Hauptfunktion aus
Richtlinie (neuer ThreadPoolexecutor.DiscardoldestPolicy ());
Auslaufergebnis: Insgesamt werden 8 Aufgaben ausgeführt. Das Programm endet. Die späteren Aufgaben betragen 9 und 10, während die vorherigen Aufgaben 3 und 4 verworfen werden.
Zusammenfassen
Das obige ist der gesamte Inhalt dieses Artikels zum Codebeispiel der Java -Thread -Pool -Sättigungsstrategie. Ich hoffe, es wird für alle hilfreich sein. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite.