Java 谁在调用run()方法
在上面的2个类中,我为程序中的每一行指定了断点。我在eclipse编辑器中开始调试,我看到的控制流是……….在执行MyDaemon类的thrd.start()方法后返回下面的代码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
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()
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.");
}