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

2

Java Virtual Machine.

当您创建Thread对象并调用start()它时,会给出JVM创建 java 线程的特殊指令,这里JVM有一些我们在普通 Java 代码中无法做到的深层魔法。通过本机调用,它创建一个新线程并导致新线程调用该run()方法。

根据线程#start

调用 start() 会导致该线程开始执行;Java 虚拟机调用该线程的运行方法

于 2013-08-31T05:11:34.563 回答
0

回答

我如何获得以下输出 com.nacre.test7.MyDaemon@152b6651is 恶魔线程.......主线程正在结束。

该程序的行为非常好。如果主线程启动的唯一线程是守护线程,则您不能接受主线程处于活动状态。请阅读 Thread 类的源代码/java doc。

此外,对于您的另一个问题,我怀疑为什么我在调试时看不到 run 方法的执行,

在调试模式下运行方法执行如下图所示: 在此处输入图像描述

于 2013-08-31T05:21:04.490 回答
0

谁在调用该run()方法?

构造函数中的thrd.start()调用MyDaemon导致它发生。

MyDaemon您实例化一个Thread对象并将其this作为参数传递。当一个Thread对象启动时,它调用它的 run()方法,并且对象的默认行为Thread.run()是调用run()它的Runnable... 如果提供了一个。

所以:

  1. MyDaemon构造函数创建一个Thread对象
  2. 构造MyDaemon函数调用thrd.start()
  3. thrd.start()使用新堆栈启动新线程
  4. 新线程调用thrd.run()
  5. thrd.run()调用实例run()_MyObject

start()请注意,步骤 1 到 3 发生在父线程上,步骤 4 到 5 发生在子线程上,在父线程中调用返回之前或之后。

于 2013-08-31T05:12:24.827 回答