java中线程的一个问题

来源:百度知道 编辑:UC知道 时间:2024/06/17 02:44:50
11. Runnable r = new Runnable() {
12. public void run() {
13. System.out.print("Cat");
14. }
15. };
16. Threadt=new Thread(r) {
17. public void run() {
18. System.out.print("Dog");
19. }
20. };
21. t.start();
What is the result?
A. Cat
B. Dog
C. Compilation fails.
D. The code runs with no output.
E. An exception is thrown at runtime.

为什么答案是B?谢谢...

这就是我们常说的多态。
我简单的说一下线程的执行原理(只说楼主关心的这一点,要全说完,我没这样的能力)。
其实Thread类用了一个代理,原理如下:
public class Thread implements Runnable{
private Runnable runnable;
public Thread(){}
public Thread(Runnable run){
this.runnable=run;
}
public void run(){
runnable.run();
}
}
/*当你重写了Thread 的run()方法,原来的当然失效了;注意呀,16行这里new 的不是Thread这个类的实例,而是一个继承了Thread 的匿名内部类,并且这个类重写了run()方法;*/

Thread t=new Thread(r)
是声明t 为一个r线程, 写到此, 确实如果t开始执行的话, 就会打印出Cat, 但是它使用匿名内部类的方法, 对这个线程对象重写类体了, 而且在run 方法中没有调用super.run(). 所以只打印自己的, 没有打印r的, 如果加上super.run(), 就会打印出Cat, 先打印还是后打印, 由代码顺序决定.

因为你启动是线程t : t.start();
t指向了一个匿名内部类,Thread本身实现了runnable,默认实现在run实现中调用参数r的run,这个匿名内部类重新实现了run方法,所以打印的就是Dog

不是 t.start()吗。t进程开始执行,而 r没执行