Thread zum Daemon machen



  • Moin, Moin...

    Ich experimentiere gerade etwas mit Threads unter Java. Dazu habe ich ein kleines Programm geschrieben, das aus 2 Klassen besteht:

    public class SimpleThread
    {
    
        public static void main(String[] args)
        {
    
            Thread myThread = new Thread(new ThreadClass("Fieser Daemon"));
    
            myThread.setDaemon(true);
            myThread.start();
    
            System.out.println();
    
            System.out.println("Thread [" + Thread.currentThread().getName() + "] ** DONE **");
        }
    }
    
    public class ThreadClass extends Thread
    {
        ThreadClass(String name)
        {
            super(name);
        }
    
        public void run()
        {
            int count;
    
            System.out.println("Ein Thread, der " + this.getName() + " heisst.");
    
            // this.setDaemon(true);
    
            if(this.isDaemon())
            {
    
                System.out.println("Daemon");
            }
            else
            {
                System.out.println("KEIN Daemon");
            }
    
            count = 0;
            while(true)
            {
    
                count++;
                if(count >= 20) break;
    
                synchronized(this)
                {
                    try
                    {
                        wait(500);
    
                    }
                    catch(InterruptedException ie)
                    {
                    }
                }
    
                System.out.println(count);
            }
    
            System.out.println("Thread " + this.getName() + " kehrt zurueck...");
    
            return;
        }
    }
    

    So wie es oben abgebildet ist, wird der Thread nicht zum Daemon gemacht, obwohl überall zu lesen ist, dass die Methode setDeamon vor der Methode start aufgerufen werden muss.
    In diesem Zustand wird die Zählschleife, die der Daemon machen soll auch nicht durchlaufen(weil der main-Thread vorher endet und damit auch der User-Thread?).

    Wenn ich die Methode setDaemon aber in der Klasse aufrufe, die ich zum Daemon-Thread machen möchte (this.setDaemon), dann klappt es, wie gewünscht.

    Was ist nun richtig?

    Wie kann ich den main-Thread veranlassen auf die Beendigung des Daemon-Threads zu warten?

    Danke im voraus...

    Ciao...



  • Thread myThread = new Thread(new ThreadClass("Fieser Daemon"));
    

    Wenn ich statt dieser Zeile

    Thread myThread = new ThreadClass("Fieser Daemon");
    

    verwende, dann erkennt der Thread auch, dass er ein Daemon ist.
    Warum der Fehler auftauch weiss ich nicht, aber er verhält sich ja wie ein Daemon. Also im Prinzip ist er einer, will es aber selber noch nicht wahr haben... oder was weiss ich 🤡

    Warten bis er fertig ist kannst du mit ner Schleife und isAlive()

    Nachtrag:
    Wenn ich in der main myThread.isDaemon() aufrufe, dann krieg ich wieder gesagt, dass er ein Daemon ist. Egal was er dann intern sagt.



  • Ok, Problem gelöst.
    In deinem Fall haben wir 2 Thread-Objekte. Eins von Thread und eins von SimpleThread. Thread ist expizit ein Daemon. Dieser ruft intern dann run() von SimpleThread auf. SimpleThread selber ist aber kein Daemon und läuft nur im Thread von Thread (hört sich blöd an oder... sorry). Ergo kann eine interne Abfrage isDaemon() kein ergebnis bringen.

    Die immer korrekte Antwort hier liefert der Aufruf von Thread.currentThread().isDaemon()


Anmelden zum Antworten