9.8 Dämonen
Ein Server reagiert oft in einer Endlosschleife auf eingehende Aufträge und führt die gewünschte Aufgabe aus. In unseren bisherigen Programmen ist aufgefallen, dass ein gestarteter Thread, sofern er eine Endlosschleife wie ein Server enthält, nie beendet wird. Wenn also run(), wie in den vorangehenden Beispielen, nie abbricht (Informatiker sprechen hier von terminiert), so läuft der Thread immer weiter, auch wenn die Hauptapplikation beendet ist. Dies ist nicht immer beabsichtigt, denn Server-Funktionalität ist nicht mehr gefragt, wenn die Applikation beendet ist. Dann sollte auch der endlose Thread beendet werden. Um das auszudrücken, erhält ein im Hintergrund arbeitender Thread eine spezielle Kennung: Der Thread wird als Dämon21 (engl. daemon) gekennzeichnet. Standardmäßig ist ein Thread kein Dämon.
Hier klicken, um das Bild zu Vergrößern
Ein Dämon ist wie ein Heinzelmännchen im Hintergrund mit einer Aufgabe beschäftigt. Wenn das Hauptprogramm beendet ist und die Laufzeitumgebung erkennt, dass kein normaler Thread läuft, sondern nur Dämonen, dann ist das Ende für die Dämonen eingeläutet. Und dies, obwohl der Dämon-Thread noch nicht terminiert hat. Wir müssen uns also um das Ende des Dämons nicht kümmern. Das ist etwa bei Überwachungsaufgaben ganz praktisch. Wenn es nichts mehr zu überwachen gibt, dann kann sich auch der Dämon in Luft auflösen.
Einen Thread in Java als Dämon zu kennzeichnen, heißt, die Methode setDaemon() mit dem Parameter true aufzurufen. Ein Dämon kann jederzeit mit setDaemon(false) wieder zu einem ganz normalen Benutzer-Thread konvertiert werden.
Die Auswirkungen von setDaemon(true) können wir am folgenden Programm ablesen:
Listing 9.10 DaemonThread.java
class DaemonThread extends Thread
{
DaemonThread()
{
setDaemon( true );
}
public void run()
{
while ( true )
;
}
public static void main( String args[] )
{
new DaemonThread().start();
}
}
In diesem Programm wird der Thread gestartet, und dann ist die Anwendung sofort beendet. Klammern wir die Anweisung mit setDaemon(true) aus, dann läuft das Programm ewig, da die Laufzeitumgebung auf das natürliche Ende der Thread-Aktivität wartet.
class java.lang.Thread
implements Runnable
|
|
void setDaemon( boolean on )
Markiert den Thread als Dämon oder normalen Thread. |
|
boolean isDaemon()
Testet, ob der Thread ein Dämon-Thread ist. |
AWT und Dämonen
Obwohl Dämonen für Hintergrundprozesse eine gute Einrichtung sind, ist der AWT-Thread kein Dämon. Unterschiedliche AWT-Threads sind normale Benutzer-Threads, dazu gehören AWT-Input, AWT-Motif oder Screen_Updater. Das bedeutet, dass bei einmaliger Nutzung einer AWT-Funktion ein spezieller Nicht-Dämon-Thread gestartet wird, so dass die Applikation nicht automatisch beendet wird, wenn das Hauptprogramm endet. Daher muss in vielen Fällen die Applikation hart mit System.exit() beendet werden.
1 Das griechische Wort daimon bezeichnet allerlei Wesen zwischen Gott und Teufel.
|