Weitere aktuelle Java-Titel finden Sie bei dpunkt.
 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index


11.5

Daemon-Threads


Daemon-Threads unterscheiden sich dadurch von normalen Threads (auch User-Threads genannt), dass ihr Status nicht bei der Ermittlung des Beendigungszeitpunkts eines Java-Programms berücksichtigt wird. Andersherum formuliert: Bei der Beendigung jedes User-Threads wird geprüft, ob noch andere User-Threads laufen. Ist das nicht der Fall, wird das Programm beendet, und zwar unabhängig davon, ob noch Daemon-Threads laufen und in welchen Zustand sie sich befinden.

Ein Java-Programm ist also genau dann zu Ende, wenn alle seine User-Threads beendet sind (wenn man eine erzwungene Beendigung mit System.exit() oder System.halt() außer Betracht lässt).

Jedes Java-Programm hat Daemon-Threads, die automatisch von der Laufzeitumgebung gestartet werden. Der wichtigste von ihnen ist der Garbage Collector. Er wird nur so lange benötigt, wie die User-Threads der Anwendung laufen. Wenn diese fertig sind, kann der Garbage Collector abgebrochen und die Virtual Machine beendet werden. Folglich macht es Sinn, den Garbage Collector als Daemon-Thread laufen zu lassen.

Daemon-Threads können nicht nur vom System, sondern auch vom Entwickler gestartet werden, um Prozesse gewissermaßen im Hintergrund auszuführen. Hierzu muss lediglich nach dem Erzeugen, aber vor dem Starten des Threads der Aufruf setDaemon(true) erfolgen. Bei der Konzeption eigener Daemon-Threads ist zu berücksichtigen, dass das Programmende für Daemon-Threads asynchron, z. B. mitten in der run()-Methode eintreten kann. Abschlussaktionen können nur in der Methode finalize() bzw. seit Version 1.4 in einer Shutdown-Routine implementiert werden.

Ein Anwendungsfall für einen Daemon-Thread könnte ein Protokollierungs-Thread für ein Programm mit grafischer Oberfläche sein. Solche Programme haben meist Leerlaufzeiten, wenn gerade keine Benutzerinteraktion stattfindet.

Daher kann die Protokollierung in einem Thread mit niedriger Priorität ausgeführt werden. Beim Beenden des Programms wird der Protokollierungs-Thread aufgrund seiner Daemon-Eigenschaft mit beendet, ohne dass er explizit angehalten werden muss.

In der Implementierung des Protokollierungs-Threads wird im Konstruktor zunächst ein Puffer für die Meldungen initialisiert, die dort von anderen Threads eingetragen werden. Weiterhin wird ein Datei-Stream geöffnet und das Daemon-Flag gesetzt.
  public LogThread(String fileName) throws IOException {
    buffer = new Vector();
    logStream = new PrintWriter(new FileWriter(fileName));
    setPriority(Thread.MIN_PRIORITY);
    setDaemon(true);
  }

In der run()-Methode wird der Puffer in einem bestimmten Intervall abgearbeitet und die enthaltenen Meldungen in die Datei geschrieben:
  public void run() {
    while(true) {
      try {
        sleep(INTERVAL);
        // Meldungen in Datei schreiben
        flushBuffer();
      }
      catch(InterruptedException e) {
      }
    }
  }


Material zum Beispiel


 Inhaltsverzeichnis   Auf Ebene Zurück   Seite Zurück   Seite Vor   Auf Ebene Vor   Eine Ebene höher   Index

Copyright © 2002 dpunkt.Verlag, Heidelberg. Alle Rechte vorbehalten.