A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 Cheers_for_CRAZ 于 2013-10-30 22:12 编辑

为什么运行下面的run方法,而不运行runnable接口中的run方法!哪位大神给个详细的解释!
public class ThreadTest {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                new Thread(new Runnable(){
                        public void run(){
                                for (int i = 0; i <50; i++) {
                                        System.out.println(Thread.currentThread().getName());
                                }
                        }
                }){
                        public void run(){
                                for (int i = 0; i <50; i++) {
                                        System.out.println("....."+Thread.currentThread().getName());
                                }
                        }
                }.start();
        }

}

评分

参与人数 1技术分 +1 收起 理由
To + 1 很给力!

查看全部评分

4 个回复

倒序浏览
new Thread(...)
这个相当于一个匿名Thread类实例,重写了run方法
new Thread(...) {...}
这个相当于之前那个的匿名子类实例,又重写了run方法
自然结果是跑子类的run方法
回复 使用道具 举报
本帖最后由 ヅ飞飞 于 2013-10-29 20:20 编辑

这问题挺有意思的,我的看法如下,如有错误和不足之处希望指正。
首先,这是个匿名内部类嵌套的问题,new Thread( new Runnble(){} ){}
其次要明确匿名内部类new的是子类对象。
那么先从里面入手:new Runnble(){ public void run(){} }:new了一个Runble子类对象并重写run方法。我们可以给其加个引用指向它便于分析,即:Runnble a =new Runnble(){ public void run(){} }。
所以外层可以写成new Thread(a){public void run(){}},(a指向的是实现了Runnble接口的类的对象。)即new了一个Tread类的子类对象重写run方法。.start()启动该线程并调用run方法。此时调用的一定是重写的run方法。
要注意的是:我们这样启动过线程:Tread t = new Tread(a); t.strart();(a是实现了Runnble接口的子类对象)这是毕老师讲的第二种启动方式,但new Thread(a){public void run(){}}这种匿名内部类的方式绝不是第二种启动方式。它是第一种启动方式,因为new Tread(a){}new的不是Tread类对象而 是Tread的子类对象,只不过该子类的构造方法是带参数的,但start方法启动它时调用的一定是自己的run方法。

评分

参与人数 1技术分 +1 收起 理由
To + 1 赞一个!

查看全部评分

回复 使用道具 举报
为何要这么写?有什么用?
回复 使用道具 举报
To 金牌黑马 2013-10-30 00:10:37
报纸
楼主你好,如果问题已解决请将帖子状态修改为提问结束,
如果未解决请继续追问,谢谢合作
修改方法请看解释帖:http://bbs.itheima.com/thread-89313-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马