请教一下一道基础的线程问题,很奇怪
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了。