Java-Thread-Pool - Wird der Thread erneuert?

8

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%     
Asaf Nevo 19.01.2013, 14:00
quelle

3 Antworten

11

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.

Ссылка )

    
rai.skumar 19.01.2013 14:05
quelle
4

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.

    
theadam 19.01.2013 14:13
quelle
0
  

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

%Vor%

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).

    
Ian Roberts 19.01.2013 14:10
quelle

Tags und Links