求解释一道多线程问题

来源:百度知道 编辑:UC知道 时间:2024/06/24 11:46:44
public class Test
{
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();
}

}
为什么输出是Dog?

这道题很经典。看似线程的问题,实质确是方法重写的问题。
Thread中run方法是这样的
public void run() {
if (target != null) {
target.run();
}
}
,target也就是new Thread(r)的时候传的 r ,本来应该是打印“cat”,但是你Thread中的run()覆盖的是整体的run(),也就是说我上面的那段代码根本就没走,你传过来的参数r根本就没起作用,而是直接走了覆盖后的方法。
很绕。其实根本没有必要看源代码,覆盖了嘛,源代码的方法根本就不执行。但是我怕你不知道源代码的话好像很神秘,就找了。

t.start()就是以线程方式启动,自然会去调用Thread中的run()方法.
如果你直接r.run(),那么就会打印Cat,因为这时就只是把run()方法当做普通方法来看待了.