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.");
}
}
}
在上面的两个类中,我给程序中的每一行指定了断点,我在eclipse中开始调试,我看到的控制流是在执行...........coming类的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方法的执行,以及如何获得以下输出
152b6651is@152b6651是恶魔线程.主线程结束了。
发布于 2013-08-30 21:21:04
回答
如何获得以下输出com.nacre.test7.Mydaemon@152b6651是恶魔线程.主线程结束了.
这个节目表现得很好。如果主线程启动的唯一线程是守护进程线程,则不能接受主线程是活动的。请阅读Thread类的源代码/ java文档。
此外,对于您的另一个问题,我的疑问是,为什么我在调试和时看不到运行方法的执行?
run方法执行以调试模式显示,如下所示:
发布于 2013-08-30 21:12:24
谁在调用
run()
方法?
thrd.start()
构造函数中的MyDaemon
调用导致了它的发生。
在MyDaemon
中,您实例化了一个Thread
对象,并将它作为参数传递给this
。当一个Thread
对象启动时,它调用它的run()
方法,而Thread.run()
对象的默认行为是在其Runnable
上调用run()
.如果有人提供的话。
所以:
MyDaemon
构造函数创建一个Thread
对象。MyDaemon
构造函数调用thrd.start()
thrd.start()
用新堆栈启动新线程。thrd.run()
thrd.run()
在MyObject
实例上调用run()
注意,步骤1到3发生在父线程上,步骤4到步骤5发生在子线程上,无论是在父线程中返回start()
调用之前还是之后。
https://stackoverflow.com/questions/18544710
复制相似问题