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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 未长法 中级黑马   /  2012-5-5 10:57  /  3892 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


new Thread(new Runnable(){ //匿名
            public voidrun(){
                System.out.println("runnablerun");
            }
        })
        {
            public voidrun(){
                System.out.println("subthreadrun");
            }
        }.start();  //结果:subthreadrun
如果一个实现了两种多线程的方式,为什么先调用Thread.start()而不是调用Runnable中的start()方法?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

11 个回复

倒序浏览
你的start方法是跟在Thread类后面的,就是指定了Thread类的run方法开启线程
如果你要开启内部类的线程 就要调用Runnable().start()
回复 使用道具 举报
1  线程的实现有两种方式,第一种方式是继承Thread 类,然后重写run 方法;第二种是实现Runnable 接口,然后实现其run法。
2  Thread 类也实现了Runnable 接口,因此实现了Runnable 接口中的run 方法;  
3  当使用第一种方式来生成线程对象时,我们需要重写run 方法,因为Thread 类的run方法此时什么事情也不做。
4  当使用第二种方式来生成线程对象时,我们需要实现Runnable 接口的run 方法,然后使用new Thread(new MyThread())  (假如MyThread 已经实现了Runnable 接口)来生成线程对象,这时的线程对象的run 方法就会调用MyThread 类的run 方法,这样我们自己编写的run 方法就执行了。
5 将我们希望线程执行的代码放到run 方法中,然后通过start 方法来启动线程,start方法首先为线程的执行准备好系统资源,然后再去调用 run 方法。
6 在Runnable接口中没有start这个方法所以只能用Thread中的start在调用线程

回复 使用道具 举报
到底是怎么回事啊,那个大师给解释解释啊?
回复 使用道具 举报
其实很简单,我给你举个例子吧!
for(int i=0;i<5;i++)
{
    printf("%d\n",i);
    for(int j=0;j<5;j++)
    {
          printf(" %d",j);
    }
    printf("\n");
}
这个的输出结果是
0
0 1 2 3 4
1
0 1 2 3 4
...
...对吧。这个例子好像不太恰当。
对于嵌套而言,是不是该优先外层呢.
你写的那段如果无视中间的部分是不是就是new Thread(obj){.....}.start()啊,所以这个start是属于thread的。所以输出的是subThreadrun啊。
我是这么理解的!
回复 使用道具 举报
本帖最后由 韩新凯 于 2012-5-6 12:38 编辑

                new Thread(new Runnable() { // 匿名
                                        public void run() {
                                                System.out.println("runnablerun");
                                        }
                                }).start();//runnablerun,这样就可以了。
                new Thread(){
                        public void run() {
                                System.out.println("subthreadrun");
                        }
                }.start();//subthreadrun
回复 使用道具 举报
你的start方法是跟在Thread类后面的,就是指定了运行Thread类的run方法中的代码。
如果你要开启内部类的线程, 就要运行内部类的run方法中的代码。
回复 使用道具 举报
啷个里个郞 发表于 2012-5-6 13:07
你的start方法是跟在Thread类后面的,就是指定了运行Thread类的run方法中的代码。
如果你要开启内部类的线 ...

你可真聰明呀,找個給分的答案就複製,你複製過我的答案也就罷了,還有我同桌的答案你也複製啊? 這地方不適合投機取巧,謝謝...
回复 使用道具 举报
袁錦泰 发表于 2012-5-6 13:25
你可真聰明呀,找個給分的答案就複製,你複製過我的答案也就罷了,還有我同桌的答案你也複製啊? 這地方不適 ...

正确答案是没有两个的。我是看了你的回答,可是我觉得我按自己对知识点的理解说的,而非机械式的复制。如果正确答案有两个的话,我当然会选择另一种答案、可答案是唯一的,无轮我们怎样回答,最后殊途同归一个答案。如果你介意我看过你的答案,我道歉。无心复制。谢谢。
回复 使用道具 举报
啷个里个郞 发表于 2012-5-6 13:34
正确答案是没有两个的。我是看了你的回答,可是我觉得我按自己对知识点的理解说的,而非机械式的复制。如 ...

看來是我錯怪你了,是我道歉才對.
咱們都是初學者,對知識的理解最重要,學到是自己的,就這麼簡單...
回复 使用道具 举报
这就需要研究Thread类中的源代码了,在你重写run()方法时,你只有一个sysytem.out.println()  要知道Thread中的run方法是有代码的,你加上super.run();
后就会两个都打印了,那么super.run()方法中的代码是什么呢?
其实就是一个判断这个Thread类的对象有没有接受 Runable对象,若有则执行Runable的run方法,没有就不执行咯;
哦了
回复 使用道具 举报
袁錦泰 发表于 2012-5-6 13:40
看來是我錯怪你了,是我道歉才對.
咱們都是初學者,對知識的理解最重要,學到是自己的,就這麼簡單... ...

谢谢理解。共同努力吧,为了梦想、黑马我们的践行梦想的第一站。加油。可以详聊哦:364674019.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马