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?

解决方案 »

  1.   

    t.run是不启动线程的.
    必须是start
      

  2.   

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

  3.   

    t的run()方法应该是用你的程序override, 而不是去调用.
      

  4.   

    tangge1010(简单) ( ) 信誉:100  2007-08-27 12:11:34  得分: 0  
     
     
       你混淆的地方在于
    文档中提及的“使用独立的 Runnable 运行对象构造的”并不是单指Runnable 对象,Runnable 是个接口,那Thread t当然也是独立的 Runnable 运行对象。
    你可以查看Thread类,是Thread implements Runnable,继承了Runnable
    看你的代码Thread t = new Thread(r){}已经将run方法覆盖了,当然运行覆盖后的run方法。=====================是我糊涂了,Thread类就是继承了Runnable接口的,如果通过Thread(Runnable target) 构造的实例调用start和run方法时都是要调用到target中定义的run方法:    
    public void run() {
    if (target != null) {
        target.run();
    }
    当这段代码中的匿名Thread类已经将run方法覆写了我晕
      

  5.   

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