日期:2014-05-20  浏览次数:20823 次

请教一下一道基础的线程问题,很奇怪
public   class   TestRun{
public   static   void   main(String[]   args){
Runnable   r   =   new   Runnable(){
public   void   run(){
System.out.print( "Cat ");
}
};
Thread   t   =   new   Thread(r){
public   void   run(){
System.out.print( "Dog ");
}
};
t.start();
t.run();
}
}

打印结果是DogDog。
以下摘自JDK5.0帮助,Thread类中的start方法:“使该线程开始执行;Java   虚拟机调用该线程的   run   方法。”
run方法:“如果该线程是使用独立的   Runnable   运行对象构造的,则调用该   Runnable   对象的   run   方法;否则,该方法不执行任何操作并返回。   ”

从start帮助中看不出为什么调用的是Thread类的run方法,但是run方法的帮助明确指出调用的就是Runnable   对象的   run   方法,那怎么还打印Dog?


------解决方案--------------------
t.run是不启动线程的.
必须是start
------解决方案--------------------
你混淆的地方在于
文档中提及的“使用独立的 Runnable 运行对象构造的”并不是单指Runnable 对象,Runnable 是个接口,那Thread t当然也是独立的 Runnable 运行对象。
你可以查看Thread类,是Thread implements Runnable,继承了Runnable
看你的代码Thread t = new Thread(r){}已经将run方法覆盖了,当然运行覆盖后的run方法。


------解决方案--------------------
t的run()方法应该是用你的程序override, 而不是去调用.
------解决方案--------------------
如果你new Thread(r).start()
就应该打印Cat

你的匿名Thread已经覆写了run(),那么start之后自动调用的run就是你覆写过的,就不像默认的去调用r.run了。