Endlos Thread beendet durch Programmende

PrincE

Aktives Mitglied
Hallo Java-Community,

ich habe mich ein wenig über Threads informiert und einiges verstanden aber bei dieser Aussage bin ich stutzig geworden..


9.6 Dämonen toptop

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ämon1 gekennzeichnet. Standardmäßig ist ein Thread kein Dämon.

Quelle: Java ist auch eine Insel – 9.6 Dämonen

Will der Autor mir damit im Ernst sagen, wenn ein anderer Thread "System.exit(0);" aufruft würde eine Endlosschleife weiter laufen also sollte die Endlosschleife ein Daemon-Thread sein?
Wenn der Endlosschleifen-Thread kein Daemon-Thread ist und das Programm beendet wird läuft doch die Schleife nicht weiter oder?!

danke im vorraus für eure Aufklärung..
 
Nein. System.exit(0) beendet die ganze JVM. Da werden alle Threads angehalten. Entscheidend ist aber, dass eine Applikation auf aufhört zu arbeiten sobald nur noch Deamonthreads laufen.
 
System.exit beendet die VM, somit sollte auch dein Thread sterben.

Ansonsten, wenn die Main so ausschaut:
Java:
{
myEndlessThread.start();
}

dann läuft dein Programm trotzdem noch weiter, wenn myEndlessThread kein Daemon-Thread ist
 
System.exit ist eine "Killer" - im wahrsten Sinne des Wortes. Es gibt kaum Fälle, wo man das wirklich benutzt. Gemeint war sowas wie
Java:
public static void main(String args[])
{
    Thread thread = new Thread(new Runnable()
    {
        public void run()
        {
            while (true) System.out.println("Ich bin Nummer 5!");
        }
    });
    //thread.setDaemon(true); // Ohne das hier terminiert de Anwendung nicht!
    thread.start();
}
 
ja wann man einen Daemon benutzt und warum hab ich verstanden ich war nur ein wenig überrascht von der aussage das wenn man bei einer endlosschleife kein daemon benutzt angeblich die schleife nie aufhört. Aber das hat der Autor anscheinend nicht wirklich damit sagen wollen.

danke jetzt kann ich beruhigt weiter programmieren ^.^
 

Zurück
Oben