0
 package com.nacre.test7;

public class TestDaemon {

    public static void main(String[] args) throws InterruptedException {

        MyDaemon dt=new MyDaemon();
        if(dt.isDaemon()){

            System.out.println(dt+"is demon thread");
            Thread.sleep(1000);
            System.out.println(" main thread is ending.");
        }

    }
}


package com.nacre.test7;

public class MyDaemon implements Runnable{

    Thread thrd;

    MyDaemon() {

        thrd=new Thread(this);
        thrd.setDaemon(true);
        thrd.start();
    }

    public boolean isDaemon(){

        return thrd.isDaemon();
    }

    public void run() { 
        try { while(true) {
            System.out.print(".");
            //Thread.sleep(100);
            }
        } catch(Exception exc) {
            System.out.println("MyDaemon interrupted."); 
            }
    }

}

上記の 2 つのクラスでは、プログラムの各行にブレークポイントを設定しました。Eclipse エディターでデバッグを開始したところ、制御フローは ....thrd を実行した後、以下のコードに戻ってきました。 MyDaemon クラスの .start() メソッド

if(dt.isDaemon()){

            System.out.println(dt+"is demon thread");
            Thread.sleep(1000);
            System.out.println(" main thread is ending.");
        }

そして今、コントロールはこの下の部分に行きます

public void run() { 
        try { while(true) {
            System.out.print(".");
            Thread.sleep(100);
            }
        } catch(Exception exc) {
            System.out.println("MyDaemon interrupted."); 
            }

私が知っていたのは、start() メソッドが呼び出されると、同時に jvm が新しいスレッドを作成して run メソッドを呼び出すことです。私の疑問は、デバッグ中に run メソッドの実行を確認できない理由と、次の出力を取得する方法です。

com.nacre.test7.MyDaemon@152b6651is デーモン スレッド ........... メイン スレッドが終了しています。

4

3 に答える 3