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