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是恶魔线程 ..........主线程正在结束。
答案 0 :(得分:2)
Java Virtual Machine
。
当您创建Thread
对象并在其上调用start()
时,为JVM
提供了创建java线程的特殊指令,这里JVM
做了一些深刻的魔法我们不能用普通的Java代码做。通过本机调用,它会创建一个新线程,并使新线程调用run()
方法。
调用start()会导致该线程开始执行; Java虚拟机调用此线程的run方法。
答案 1 :(得分:0)
谁正在调用
run()
方法?
thrd.start()
构造函数中的MyDaemon
调用导致它发生。
在MyDaemon
中,您实例化一个Thread
对象并将其作为参数传递给它this
。启动Thread
对象时,它会调用其 run()
方法,而Thread.run()
对象的默认行为是在其上调用run()
Runnable
...如果提供了一个。
所以:
MyDaemon
构造函数创建了一个Thread
对象MyDaemon
构造函数调用thrd.start()
thrd.start()
使用新堆栈启动新线程thrd.run()
thrd.run()
在run()
实例MyObject
醇>
请注意,步骤1到3发生在父线程上,步骤4到5发生在子线程上,在start()
调用在父线程中返回之前或之后。
答案 2 :(得分:0)
回答
我如何获得以下输出 com.nacre.test7.MyDaemon@152b6651是恶魔线程..........主线程正在结束。
该程序表现得非常好。如果它启动的唯一线程是守护程序线程,则不能接受主线程是活动的。请阅读Thread类的源代码/ java doc。
此外,对于您的另一个问题我的疑问是,为什么我无法在调试时看到run方法的执行
运行方法执行在调试模式中显示如下: