请教一个“java多线程runnable匿名传入线程的问题”

网上一个学习资料中 有下面的 程序:
new Thread(new Runnable(){ //匿名
public void run(){
System.out.println("runnable run");
}
})
{
public void run(){
System.out.println("subthread run");
}
}.start(); //结果:subthread run

结果为啥 不是 "runnable run"?
个人小白,请高手赐教,多谢!
(是因为 Thread中的run方法 重写了 Runnable中的 run方法吗?)

一点一点分析:

把代码拆成4部分,
1.  new Thread()声明一个对象,这里用了匿名类的方式,后面有具体实现
2 声明匿名类实现
{
    public void run(){
        System.out.println("subthread run");
    }
}
3 然后看这匿名对象的构造参数,
new Runnable(){ //匿名
    public void run(){
        System.out.println("runnable run");
    }
}
4 已经拿到了匿名Thread的引用,调用start()方法
实际上就是一个匿名对象Thread,传入了一个匿名对象Runnable作为构造参数。
对比一下正常的线程创建方式:
 第一种:   class test implements Runnable(){
        @override
        public void run(){
            ...
        }
    }
    ...main(){
        Thread thread = new Thread(new test());
        thread.start();
    }
 第二种:再看用Thread的方式
     class test2 extends Thread(){
         @override
         public void run(){
             ....
         }
     }
也就是说:
你贴的代码就是第一种方式,只不过用了匿名的方式,
然后创建thread对象的时候
如果构造方法传入了runable、callable接口的参数,那就运行传入的参数
而不再运行自己的run方法。

温馨提示:答案为网友推荐,仅供参考
相似回答