Java 谁在调用run()方法

Java 谁在调用run()方法,java,Java,在上面的2个类中,我为程序中的每一行指定了断点。我在eclipse编辑器中开始调试,我看到的控制流是……….在执行MyDaemon类的thrd.start()方法后返回下面的代码 package com.nacre.test7; public class TestDaemon { public static void main(String[] args) throws InterruptedException { MyDaemon dt=new MyDaemon

在上面的2个类中,我为程序中的每一行指定了断点。我在eclipse编辑器中开始调试,我看到的控制流是……….在执行MyDaemon类的thrd.start()方法后返回下面的代码

 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."); 
            }
    }

}
现在控件将转到下面的部分

if(dt.isDaemon()){

            System.out.println(dt+"is demon thread");
            Thread.sleep(1000);
            System.out.println(" main thread is ending.");
        }
我所知道的是,当调用start()方法时,jvm会通过创建一个新线程来同时调用run方法,我的疑问是,为什么我在调试时看不到run方法的执行 以及我是如何得到以下输出的

com.nacre.test7。MyDaemon@152b6651is魔线
.......... 主线程已结束。

Java虚拟机

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

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

谁在调用
run()
方法

MyDaemon
构造函数中的
thrd.start()
调用导致了这种情况的发生

MyDaemon
中,实例化一个
Thread
对象,并将其
this
作为参数传递。当
线程
对象启动时,它调用其
运行()
方法,而
线程.run()
对象的默认行为是在其
可运行
上调用
运行()
。。。如果有人提供的话

因此:

  • MyDaemon
    构造函数创建一个
    Thread
    对象
  • MyDaemon
    构造函数调用
    thrd.start()
  • thrd.start()
    使用新堆栈启动新线程
  • 新线程调用
    thrd.run()
  • thrd.run()
    MyObject
    实例上调用
    run()
  • 请注意,步骤1到3发生在父线程上,步骤4到5发生在子线程上,在父线程中的
    start()
    调用返回之前或之后。

    回答

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

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

    此外,对于您的另一个问题,我的疑问是,为什么在调试和

    在调试模式下,运行方法的执行如下所示:

    您给出的图片显示的是public void run()方法,但现在它显示的控件与类中的其他语句一样进入run()方法。。。。。。。。。。这就是我要问的,你不会看到的。原因主线程在最后一条语句执行后立即终止。现在您已经丢失了调试器。如果要在run方法中查看控件,请将睡眠时间增加到100000毫秒,然后在run方法中放置调试点。此外,当主线程唤醒时,它将停止工作,然后您将再次松开调试器。调试器不可用于hte守护进程线程执行OK我知道了……….我的另一个疑问是,“当运行的线程都是守护进程线程时,Java虚拟机会退出。”我从api复制了它,它是什么意思…………它是说……。如果所有线程都是demon线程,jvm将停止工作……。如果没有正确的更正我。下面是java源代码的片段:当java虚拟机启动时,通常只有一个非守护进程线程(它通常调用某个指定类的名为main的方法)。Java虚拟机将继续执行线程,直到发生以下任一情况:类Runtime的exit方法已被调用,并且安全管理器已允许执行exit操作。通过从调用run方法返回或引发异常,所有非守护进程线程都已死亡它的传播超出了run方法。
    public void run() { 
            try { while(true) {
                System.out.print(".");
                Thread.sleep(100);
                }
            } catch(Exception exc) {
                System.out.println("MyDaemon interrupted."); 
                }