Ich habe einen Thread-Pool in meinem Java.NIO-Socket-Server.
Ich habe manchmal Laufzeitfehler wie Connection reset by peer
oder Broken Pipe
usw. erhalten.
Meine Frage ist: Wird der Thread getötet, wenn eine Ausnahme ausgelöst wird? Wenn dies der Fall ist - wird ein neuer Thread im Thread-Pool anstelle des getöteten Threads erstellt?
Das ist mein ThreadManager:
%Vor%Wenn Sie ExecutorService verwenden, um einen Thread-Pool zu erstellen.
So Ja , ExecutorService.newFixedThreadPool (..) wird sichergestellt, dass die Anzahl der Threads konstant ist, wenn sie durch eine Ausnahme / einen Fehler beendet werden und auf die Task warten muss Faden. Unter dem Text von java doc steht klar:
Direkt von Java doc: newFixedThreadPool
Erstellt einen Thread-Pool, der eine feste Anzahl von Threads wiederverwendet, die von einer gemeinsam genutzten, nicht verbundenen Warteschlange aus arbeiten. Zu jedem Zeitpunkt sind höchstens nThreads-Threads aktive Verarbeitungsaufgaben. Wenn zusätzliche Aufgaben gesendet werden, wenn alle Threads aktiv sind, warten sie in der Warteschlange, bis ein Thread verfügbar ist. Wenn ein Thread aufgrund eines Fehlers während der Ausführung vor dem Herunterfahren beendet wird, wird ein neuer Thread verwendet, falls dies zur Ausführung nachfolgender Tasks erforderlich ist. Die Threads im Pool werden existieren, bis sie explizit heruntergefahren werden.
Ссылка )
Die ThreadPoolExecutor
verwaltet die Anzahl der Threads basierend auf den von Ihnen gewählten Einstellungen (im Konstruktor oder über die von Ihnen verwendete Hilfsmethode). Es funktioniert genau wie in ThreadPoolExecutor javadoc beschrieben.
Aus dem Konstruktor (siehe unten) sind die interessantesten Parameter corePoolSize
und maximumPoolSize
. corePoolSize
ist die niedrigste Anzahl an Threads, die am Leben bleiben. Wenn ein Thread beendet wird und die Anzahl der Threads unter diese Zahl fällt, werden neue Threads gestartet (1) (irgendwann).
maximumPoolSize
ist die maximale Anzahl der Threads im Pool. Wenn dieser Wert höher als corePoolSize
ist, hat Ihr Pool möglicherweise mehr Threads als Sie in corePoolSize
parameter angegeben haben. Wenn einer der Threads zu diesem Zeitpunkt abstürzt und die Anzahl der Live-Threads nicht unter corePoolSize
number fällt, wird kein neuer Thread erstellt.
Der feste Thread-Pool, den Sie über die Helper-Klasse Executors erstellen, hat corePoolSize == maximumPoolSize. Der Service stellt also sicher, dass immer die gleiche Anzahl an Threads verfügbar ist [1] (wann benötigt).
[1] Ein wichtiger Hinweis ist, dass die Erstellung der Threads "on demand" erfolgt - dh wenn ein Thread abstirbt und sich keine Aufgaben in der Warteschlange befinden, wird der Thread nicht erstellt bis es nicht benötigt wird (indem oben bereits verfügbare Threads in die Warteschlange gestellt werden).
%Vor%[EDIT] - habe die andere Frage vergessen. Tatsächlich töten Ausnahmen Worker-Threads - Sie müssen intern mit Fehlern umgehen. Einzelheiten finden Sie in der Klasse java.util.concurrent.ThreadPoolExecutor.Worker. Die runTask-Methode sollte überprüft werden.
Meine Frage ist: Wird der Thread bei einem Fehler beendet?
und wenn es das tut - füllt der Thread-Pool seine Position im Pool mit dem neuen Thread?
Der Executor, der von Executors.newFixedThreadPool
erstellt wurde, erstellt einen neuen Thread, wenn einer der Threads im Pool ausfällt. Die Antwort auf den zweiten Teil Ihrer Frage lautet also yes. Was den ersten Teil anbelangt, ist es unmöglich zu sagen, ohne den Code von MessagesProcessor
und LogoutClient
zu sehen, aber da alle toten Threads ersetzt werden, spielt es keine Rolle, auf welche Weise. Wenn MessagesProcessor
und LogoutClient
die Ausnahmen intern abfangen und protokollieren
Dann wird die Ausnahme nicht von der Methode run
übernommen, sodass der Thread, der die Aufgabe ausführt, nicht gelöscht wird, sodass sie in den Pool zurückkehren kann. Aber wenn sie die Ausnahmen nicht abfangen und erlauben, dass RuntimeException
aus der run
-Methode geworfen wird, dann stirbt der Thread (und wird durch einen neuen ersetzt).
Tags und Links java multithreading