Advanced Java Services | Dämonen (Backgroundthreads) |
Es kann vorkommen, daß ein Thread länger dauert als Main. In diesem Fall gibt es zwei Möglichkeiten, entweder wird beim Ende von Main dieser Thread beendet oder der Thread läuft nach Main noch weiter. Beide Varianten sind möglich. Das folgende Beispiel zeigt, daß ein Thread normalerweise nicht von Main beendet wird. Das Programmende wird nicht durch Main bestimmt sondern durch das Ende des letzten von Main aus gesterteten Threads.
/* Die vom Thread verwendete Methode */ static void Run() { Thread.CurrentThread.Name = "thread"; ConsoleColor defaultColor = Console.ForegroundColor; for (int i = 0; i < 7; i++) { Console.ForegroundColor = ConsoleColor.DarkRed; Console.WriteLine(Thread.CurrentThread.Name); Console.ForegroundColor = defaultColor; Thread.Sleep(200); // 200 ms } }
Main startet diesen Thread
/* Thread dauert länger als Main Dasselbe Run wie in Beispiel 1a, nur Main dauert kürzer */ public static void Main(string[] args) { Thread.CurrentThread.Name = "main"; Thread th = new Thread(Run); th.Start(); for (int i = 0; i < 3; i++) { Console.WriteLine(Thread.CurrentThread.Name); Thread.Sleep(200); // 200 ms } }
Hier drei Abläufe dieses Threads.
Man kann einen Thread aber so konfigurieren, daß er bei Programmende automatisch abgebrochen wird. Dazu erzeugt man einen sog. Dämonthread, indem man vor dem Start des Threads die Methode setDaemon(boolean on) mit true aufruft. Die JVM beendet dann diesen Thread automatisch, wenn der letzte (Nichtdämon-) Thread sich beendet hat.
Wir verändern nun den Thread des vorigen Beispiels so, daß er als Dämon läuft. Dazu setzen wir die Property IsBackground auf true, bevor der Thread gestartet wird. Die vcom Thread gerufene Methode bleibt unverändert.
/* Thread dauert länger als Main, wird aber vorzeitig beendet */ private static void beispiel1c() { Thread.CurrentThread.Name = "main"; Thread th = new Thread(Run); th.IsBackground = true; th.Start(); for (int i = 0; i < 3; i++) { Console.WriteLine(Thread.CurrentThread.Name); Thread.Sleep(200); // 200 ms } }
Im folgenden vier verschiedene Abläufe des Threads.