谁正在调用run()方法

时间:2013-08-31 05:06:59

标签: java

 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编辑器中开始调试,我看到控制流程是...........回到下面的代码执行MyDaemon类的thrd.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@152b6651是恶魔线程 ..........主线程正在结束。

3 个答案:

答案 0 :(得分:2)

Java Virtual Machine

当您创建Thread对象并在其上调用start()时,为JVM提供了创建java线程的特殊指令,这里JVM做了一些深刻的魔法我们不能用普通的Java代码做。通过本机调用,它会创建一个新线程,并使新线程调用run()方法。

根据Thread#start

  

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

答案 1 :(得分: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()实例
  6. 上调用MyObject

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

答案 2 :(得分:0)

回答

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

该程序表现得非常好。如果它启动的唯一线程是守护程序线程,则不能接受主线程是活动的。请阅读Thread类的源代码/ java doc。

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

运行方法执行在调试模式中显示如下: enter image description here