Der Thread-Pool ist eigentlich eine Implementierung der Pooling-Technologie. Die Kernidee der Pooling-Technologie besteht darin, die Wiederverwendung von Ressourcen zu realisieren und den durch die wiederholte Erstellung und Zerstörung von Ressourcen verursachten Leistungsaufwand zu vermeiden. Der Thread-Pool kann eine Reihe von Threads verwalten, sodass die Threads nach Abschluss der Aufgabe nicht zerstört werden, sondern weiterhin Aufgaben verarbeiten, die von anderen Threads übermittelt wurden.
Vorteile der Verwendung eines Thread-Pools
Reduzieren Sie den Ressourcenverbrauch. Reduzieren Sie die Kosten für die Erstellung und Zerstörung von Threads, indem Sie erstellte Threads wiederverwenden.
Verbessern Sie die Reaktionsgeschwindigkeit. Wenn eine Aufgabe eintrifft, kann die Aufgabe sofort ausgeführt werden, ohne auf die Erstellung des Threads warten zu müssen.
Verbessern Sie die Thread-Verwaltbarkeit. Threads sind knappe Ressourcen. Wenn sie ohne Einschränkungen erstellt werden, verbrauchen sie nicht nur Systemressourcen, sondern verringern auch die Stabilität des Systems. Der Thread-Pool kann für eine einheitliche Zuordnung, Optimierung und Überwachung verwendet werden.
Konstruktionsparameter
corePoolSize: Wird für die Arbeit im Thread-Pool verwendetAnzahl der Kernthreads。
maximalePoolgröße:Maximale Anzahl an Threads , die maximale Anzahl von Threads, die vom Thread-Pool erstellt werden dürfen. Wenn die Anzahl der Threads im Thread-Pool die Kernpoolgröße erreicht, die Aufgabenwarteschlange voll ist und neue Aufgaben verarbeitet werden müssen, erstellt der Thread-Pool neue Threads (die Gesamtzahl überschreitet jedoch nicht die maximale Poolgröße), um diese Aufgaben zu verarbeiten. (Dies entspricht, wenn der Warteschlangenbereich voll ist und nachfolgende Threads direkt in die Warteschlange springen können.) Wenn die Anzahl der Aufgaben die maximale Poolgröße überschreitet und die Aufgabenwarteschlange voll ist, verarbeitet der Thread-Pool diese nicht ausführbaren Aufgaben gemäß der Ablehnungsrichtlinie.
keepAliveTime: Die Überlebenszeit von Threads, die nach dem Überschreiten von corePoolSize oder allen Threads erstellt wurdenMaximale Überlebenszeit, abhängig von der Konfiguration.
Einheit: keepAliveTimeZeiteinheit。
Arbeitswarteschlange:Aufgabenwarteschlange ist eine blockierende Warteschlange. Wenn die Anzahl der Threads die Anzahl der Kern-Threads erreicht, wird die Aufgabe in der blockierenden Warteschlange gespeichert. Allgemeine Implementierungen: Implementierungsklassen der BlockingQueue-Schnittstelle, wie ArrayBlockingQueue, LinkedBlockingQueue usw.
threadFactory: Wird zum Erstellen von Threads innerhalb des Thread-Pools verwendetFabrik。
Handler:Richtlinie verweigern;Wenn die Warteschlange voll ist und die Anzahl der Threads die maximale Anzahl an Threads erreicht, wird diese Methode aufgerufen, um die Aufgabe zu verarbeiten.
So stellen Sie Parameter ein
1. Bestimmen Sie die Anzahl der Kernthreads (corePoolSize)
CPU-intensive Aufgaben: Bei CPU-intensiven Aufgaben ist es üblich, die Anzahl der Kernthreads auf das Ein- bis Zweifache der Anzahl der CPU-Kerne festzulegen. Dies stellt die volle Auslastung der CPU-Ressourcen sicher und vermeidet gleichzeitig übermäßige Kontextwechsel.
E/A-intensive Aufgaben: Für E/A-intensive Aufgaben können mehr Kernthreads festgelegt werden, da Threads beim Warten auf E/A-Vorgänge nicht die CPU belegen. Im Allgemeinen kann die Anzahl der Kernthreads auf mehr als das Zweifache der Anzahl der CPU-Kerne eingestellt werden, sodass beim Warten auf E/A mehr Aufgaben verarbeitet werden können.
Gemischte Aufgaben: Wenn Ihre Anwendung sowohl CPU-intensive als auch E/A-intensive Aufgaben enthält, müssen Sie die Einstellungen für die Anzahl der Kernthreads je nach Situation ausgleichen.
2. Bestimmen Sie die maximale Anzahl von Threads (maximumPoolSize)
Umgebungen mit eingeschränkten Ressourcen: In Umgebungen mit eingeschränkten Ressourcen (z. B. eingebettete Systeme oder Cloud-Server) muss die maximale Anzahl von Threads begrenzt werden, um zu verhindern, dass zu viele Threads Ressourcen belegen.
System mit hoher Parallelität: Für Systeme, die eine große Anzahl gleichzeitiger Anforderungen verarbeiten müssen, kann die maximale Anzahl von Threads entsprechend erhöht werden, um die gleichzeitigen Verarbeitungsfähigkeiten des Systems zu verbessern. Die Einstellung der maximalen Thread-Anzahl sollte jedoch umfassend auf der Grundlage der Auslastung und der Ressourcenbedingungen des Systems berücksichtigt werden.
3. Thread-Leerlaufzeit festlegen (keepAliveTime)
CPU-intensive Anwendungen: Für CPU-intensive Anwendungen können Sie die Thread-Leerlaufzeit normalerweise auf einen kürzeren Wert einstellen, da CPU-Ressourcen sehr wertvoll sind und Sie nicht möchten, dass zu viele inaktive Threads Ressourcen belegen. In einigen Fällen kann es sogar auf 0 gesetzt werden, was bedeutet, dass Nicht-Kern-Threads nicht beibehalten werden.
E/A-intensive Anwendungen: Da Threads bei E/A-intensiven Anwendungen beim Warten auf E/A-Vorgänge keine CPU-Ressourcen belegen, kann die Thread-Leerlaufzeit auf einen längeren Wert (z. B. mehr als 1 Minute) eingestellt werden, um häufiges Starten und Zerstören von Threads zu vermeiden . der verursachte Leistungsaufwand.
4. Wählen Sie die Aufgabenwarteschlange (workQueue) aus.
begrenzte Warteschlange : Die Verwendung einer begrenzten Warteschlange kann die Wartezeit von Aufgaben in der Warteschlange begrenzen und einen Speicherüberlauf aufgrund zu vieler Aufgaben vermeiden. Wenn die Warteschlangenlänge jedoch zu klein eingestellt ist, können Aufgaben abgelehnt werden. (Wählen Sie im Allgemeinen eine begrenzte Warteschlange)
Unbegrenzte Warteschlange: Durch die Verwendung einer unbegrenzten Warteschlange können alle Aufgaben so weit wie möglich zwischengespeichert werden. Sie müssen jedoch auf Probleme mit dem Speicherverbrauch achten. Wenn eine unbegrenzte Warteschlange verwendet wird, kann der Parameter für die maximale Anzahl von Threads des Thread-Pools ungültig werden, da der Thread-Pool nicht versucht, neue Threads zu erstellen, um Aufgaben in der Warteschlange zu verarbeiten.
5. Thread-Factory konfigurieren (threadFactory)
Thread Factory wird zum Erstellen neuer Threads verwendet. Durch Anpassen der Thread-Factory können Sie die Priorität des Threads, den Daemon-Thread-Status und andere Attribute festlegen und außerdem einen aussagekräftigen Namen für den Thread festlegen, um die Problemdiagnose in der JVM zu erleichtern.
6. Ablehnungsrichtlinie konfigurieren (Handler)
Wenn der Thread-Pool keine neuen Aufgaben verarbeiten kann (d. h. die Anzahl der Threads hat die maximale Poolgröße erreicht und die Aufgabenwarteschlange ist voll), muss eine Ablehnungsrichtlinie konfiguriert werden, um diese nicht ausführbaren Aufgaben zu verarbeiten.Zu den gängigen Ablehnungsstrategien gehören:Lösen Sie direkt eine Ausnahme aus、Verwenden Sie den Thread des Aufrufers, um die Aufgabe auszuführen、Ignorieren Sie neue Aufgaben und verwerfen Sie die ältesten Aufgaben in der Warteschlange Warten. Sie können die Ablehnungsrichtlinie auch nach Bedarf anpassen.