Mit der zunehmenden Anzahl von CPU-Kernen ist es unvermeidlich, Multi-Threading-Technologie zu verwenden, um die Rechenleistung vollständig zu nutzen. Daher ist Multi-Threading-Technologie eine Technologie, die Serverentwickler beherrschen müssen.
Die Erstellung und Zerstörung von Threads umfasst Systemanrufe und -verbrauch. Daher wird die Thread -Pooling -Technologie eingeführt, um eine häufige Erstellung und Zerstörung von Fäden zu vermeiden.
In Java gibt es eine ausführende Tool -Klasse, die für uns einen Thread -Pool erstellen kann. Die Essenz ist für ein neues ThreadPoolexecutor -Objekt. Threadpools sind fast auch ein Muss in Interviewfragen. Dieser Abschnitt kombiniert den Quellcode, um über das Arbeitsprinzip von ThreadExecutor zu sprechen
1. Fadenbeckenerstellung
Schauen wir uns zunächst die vollständigsten Konstruktorparameter von ThreadPoolexecutor an:
① CorePoolSize: Die Anzahl der Kernfäden im Thread -Pool. Um es unverblümt auszudrücken, gibt es auch wenn es keine Aufgaben im Thread -Pool gibt, es gibt Corepoolsize -Threads, die auf Aufgaben warten.
②MaximumpoolSize: Die maximale Anzahl von Threads. Unabhängig davon, wie viele Aufgaben Sie einreichen, ist die maximale Anzahl von Worker -Threads im Thread -Pool Maximumphoolsize.
③ Keepalivetime: Die Überlebenszeit des Fadens. Wenn die Anzahl der Threads im Thread -Pool größer ist als Corepoolsize, wenn nach dem Warten auf Keepalivetime keine Aufgabe ausgesetzt werden muss, geht der Thread aus.
⑤Unit: Dies wird verwendet, um die Einheit der Keepalivetime anzugeben, wie z. B. Sekunden: Zeitversorgungssekunden.
⑥ WorkQueue: Eine blockierende Warteschlange, und die eingereichten Aufgaben werden in diese Warteschlange gestellt.
⑦ ThreadFactory: Eine Thread -Fabrik, die zum Erstellen von Threads verwendet wird, hauptsächlich, um den Thread zu benennen. Der Standardfabrik-Thread-Name ist Pool-1-Thread-3.
⑧Handler: Lehnen Sie die Richtlinie ab, die aufgerufen wird, wenn die Fäden im Fadenpool erschöpft sind und die Warteschlange voll ist.
Die oben genannten sind die Parameter, die beim Erstellen eines Thread -Pools verwendet werden. Interviewer stellen diese Frage während der Interviews oft.
2. Thread Pool Ausführungsprozess
Hier ist ein Diagramm, um den Ausführungsprozess des Thread -Pools zu veranschaulichen
Wenn eine Aufgabe an den Thread -Pool übermittelt wird, wird zunächst bestimmt, ob die aktuelle Anzahl der Threads weniger als Corepoolsize ist. Wenn es weniger als ist, wird ein Thread erstellt, um die eingereichte Aufgabe auszuführen. Andernfalls wird die Aufgabe in die Workqueue -Warteschlange gestellt. Wenn der WorkQueue voll ist, wird festgelegt, ob die aktuelle Anzahl der Threads weniger als Maximumpoolsize ist. Wenn es weniger als ist, wird ein Thread erstellt, um die Aufgabe auszuführen. Andernfalls wird ein Handler aufgerufen, um anzuzeigen, dass sich der Thread -Pool weigert, die Aufgabe zu erhalten.
Nehmen Sie hier den Quellcode von JDK1.8.0_111 als Beispiel, um die spezifische Implementierung anzuzeigen.
1. Schauen Sie sich zuerst die Ausführungsmethode des Threadpools an
①: Bestimmen Sie, ob die aktuelle Anzahl der aktiven Threads geringer ist als Corepoolsize. Wenn es weniger ist als, rufen Sie Addworker an, um einen Thread zu erstellen, um Aufgaben auszuführen
②: Wenn es nicht weniger als Corepoolsize ist, fügen Sie die Aufgabe der Workqueue -Warteschlange hinzu.
③: Wenn der Workqueue in den Workqueue gesteckt wird, führt der Erstellungs -Thread die Aufgabe aus. Wenn der Erstellungs -Thread zu diesem Zeitpunkt fehlschlägt (die aktuelle Anzahl der Threads ist nicht weniger als MaximumpoolSize), wird das Ablehnungsabweis aufgerufen (interner Anrufhandler), und weigert sich, die Aufgabe zu akzeptieren.
2. Schauen wir uns die Implementierung der Addworker -Methode an
Dieser Code ist beim Erstellen eines Nicht-Kern-Threads, dh Kern gleich falsch. Bestimmen Sie, ob die aktuelle Anzahl der Threads größer oder gleich Maximumumpoolsize ist. Wenn es größer oder gleich falsch ist, dh die Erschaffung von Thread ist in ③ oben erwähnt.
Die zweite Hälfte der Addworker -Methode:
① Erstellen Sie ein Arbeiterobjekt und instanziieren Sie ein Thread -Objekt.
Starten Sie diesen Thread
3.. Gehen Sie zu Worker, um die Umsetzung zu sehen
Sie können sehen, dass ThreadFactory beim Erstellen eines Arbeiters aufgerufen wird, um einen Thread zu erstellen. Das Starten eines Threads in der obigen ② auslöst die Run -Methode des Workers, die vom Thread aufgerufen werden soll.
4. Als nächstes werfen wir einen Blick auf die Logik der Runworker -Methode.
Der Thread ruft RunWoker auf und ruft die Gettask -Methode auf, um die Aufgabe aus der WorkerQueue zu lesen und dann die Aufgabe auszuführen. Solange die Gettask -Methode nicht null zurückgibt, wird dieser Thread nicht beendet.
5. Schauen wir uns schließlich die Implementierung der Gettask -Methode an
① Lassen Sie uns erlaubte CoretHhreadTimeout ignorieren, der Standardwert dieser Variablen ist falsch. WC> corepoolsize bestimmt, ob die aktuelle Anzahl der Threads größer ist als Corepoolsize.
② Wenn die aktuelle Anzahl der Threads größer ist als Corepoolsize, wird die Umfragemethode des Worksqueue aufgerufen, um die Aufgabe zu erhalten, und die Zeitüberschreitung ist keepalivetime. Wenn die Zeit der Keepalivetime die Zeitlimit überschreitet, wird die Umfrage null zurückgegeben, und das oben erwähnte, wird nach Abfolge beendet, und der Thread wird ausgeführt.
Wenn die aktuelle Anzahl der Threads weniger als Corepoolsize ist, wird die Methode des Workqueue momentan aufgerufen.
Der obige Artikel basiert auf dem Arbeitsprinzip und dem Quellcode -Interpretation des Thread -Pools. Dieser Artikel ist der gesamte Inhalt, der vom Editor geteilt wird. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.