# Thread überwachen  / auf Thread-Tod reagieren



## Marky (15. Apr 2005)

Hi,

folgendes Problem: Ich habe einen Server, bei dessen Start ein nebenläufiger Process gestartet wird, um irgendwelche Arbeit zu verrichten. Dieser Prozess läuft solange der Server läuft.
Jetzt möchte ich aber aus Sicherheitsgründen mitbekommen, wenn dieser Prozess mal stirbt, um ihn dann neu zu starten.
Welche Möglichkeiten habe ich.
Anmerkung: Ich möchte nicht das ThreadDeath-Object "catchen" oder sonstwas, um dann zu ragieren, da niemals explizit ein stop() aufgerufen wird.
Habe ich die Möglichkeit den Thread anderweitig auf seine Existenz hin zu überwachen ?

Gruß


----------



## Bleiglanz (15. Apr 2005)

vor dem ende der run methode (oder vor einem "return" nach interrupted) einfach einen Listener benachrichtigen, der sich zuvor am thread objekt registriert hat

schau in die API: isAlive


----------



## stev.glasow (15. Apr 2005)

Was für Sicherheitsgründe sind das? Zwecks decompilieren oder Threads von außen killen.


----------



## Guest (15. Apr 2005)

Sicheriheit für mich, dass ich immer weiß, ob der Thrad noch läuft und dass ich im Fehlerfall reagieren kann.
Die Listener-Idee wäre ja dabei eine Möglichkeit ...


----------



## stev.glasow (15. Apr 2005)

achso


----------



## Bleiglanz (15. Apr 2005)

erst mal mit isAlive probieren bevor du mit den Listenern anfängst...?


----------



## Guest (15. Apr 2005)

ja, isAlive() wäre sicher die einfachste Lösung, wobei ich dann im Server-Thread immer isAlive() abfragen müßte.
Spricht ja nix dagegen.
Allerdings wäre das mit dem Listener, wie mir scheint, eine elegante Variante, wobei mir Dein Vorgschlag noch nicht ganz klar ist:
Wenn ich sich der Thread an einem PropertyChangeListener registiert hat feuert er, nach Deinem Vorschlag einmal ein Event, z.B. "alive", wenn er gestartet wird. Wenn der Thread jetzt stirbt müßte ja ein entsprechend gegenteiliges Event gefeuert werden. Wie kann ich das garantieren ?
Das Event muss ja vom Thread ausgehen. Wie kann ein Toter noch was sagen ?  

Server implementiert PropertyChangeListener
Prozess.addThreadIsDeadListener(server);

Im Prozess würde ich dann fragen isAlive() und wenn da false zurückkommen müßte, lebt ja der Thread nicht mehr ?!

Aber ich glaube ich muß mich in dieses Konzept mal einarbeiten, bevor ích hier weiter "ahnungslose Fragen" stelle    oder sollte vielleicht besser Variante a) wählen ...


----------



## Karl (19. Apr 2005)

Hallo,

ein "toter Thread" ist als Objekt weiter vorhanden. Die VM setzt den Zustand, somit klappt auch isAlive() selbst
wenn ein Thread-Mörder mit stop() zuschlägt.
Es gibt eine ganz nette Alternative zum Polling auf isAlive(). Wenn T1 Dein Thread ist, kannst Du Deinen Überwachungsthread T2 auch mit dem Befehl T1.join() auf das Ende von T1 warten lassen. Dabei verbraucht er wenig Ressourcen. Er wird "geweckt", wenn T1 irgendwie stirbt und kann dann tätig werden. 
T2 sollte mit setDaemon() zu einem Dämon gemacht werden. 
Falls T2 nach dem Tod von T1 automatisch für einen Ersatz sorgen soll, brauchst Du noch ein Prüfkriterium, ob
nicht gerade das Programm geordnet beendet werden soll.

Falls jemand übrigens verbotenerweise suspend() auf T1 aufruft, bekommst Du das nicht mit, weil der Thread ja offiziell noch lebt.

Gruß,
Karl


----------

