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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马--张帅 初级黑马   /  2012-9-1 13:18  /  2068 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马--张帅 于 2012-9-1 13:21 编辑

class Demo1 implements Runnable
{
        public void run()
        {
                System.out.println("Hello World!");
        }
}
class Demo
{
        public static void main(String[] args)
        {
                Demo1 d = new Demo1();
                Thread t = new Thread();//当没有把对象d作为参数传给线程t时,线程t调用的是Runnable自己的run方法。
                Thread t = new Thread(d);//当没有把对象d作为参数传给线程t时,线程t调用的是Demo1的run方法。
                t.start();

        }
}
问题是:为什么当把对象d作为参数传给线程t时,线程t调用的就是Demo1的run方法?具体的调用过程是怎样的?

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 加油~

查看全部评分

4 个回复

倒序浏览
1,当不传对象参数时,因为Thread 实现了Runnable 接口,重写了run()方法,当然就调用的就是Thread自己重写的方法
2,当传对象参数,首先调用了Thread类的构造方法,传的参数是对象,这点很重要。。当t.start()执行时, 首先执行的是自己重写的run()方法。但是,重点是 这个run方法中运行的代码就是Demo类的run()方法,意思就是Thread类中run方法调用了Demo类中的run()方法。  而Demo类中的run()方法是需要被自己对象用的,其实这就是为什么要Demo对象做参数传到Thread构造函数中的原因。
   至于run中有run 方法 ,可以参照java源代码    在619行

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
在Thread中有一个构造函数,是接受Runnable类对象的然后创建线程,然后调用Runnable的run方法,你的Demo1继承了Runnable类,所以当d作为参数建立Thread对象时,d中的润run方法就覆盖了Thread的run方法,毕老师的视频里面有讲的,你仔细看看,或者自己查看API文档看看
回复 使用道具 举报
要理解这个问题,最好的方法就是从Java的源代码进行说明。
我从中截取一部分有用的代码进行说明:
  1. private Runnable target;     //Thread类中的成员变量
  2. public void run() {     //Thread中的run方法
  3. if (target != null) {
  4. target.run();
  5. }
  6. }
复制代码
private Runnable target,的作用无非就是利用接口来接受实现接口的实例化对象
以你的程序为例就是有两种情况:
1、Thread t = new Thread()
      此时,并没有通过Thread类的构造函数传递任何实现Runnable接口的类,所以此时target为空。
      这时,调用run()方法,必然没有任何效果,因为target = null。
2、 Thread t = new Thread(d);
      此时,相当于执行过以下语句Runnable target = new Demo1;
      所以此时target并不为空,当不为空的时候就要调用target的run方法,即你写的Demo1中的run方法的内容。

评分

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

查看全部评分

回复 使用道具 举报
郑义 发表于 2012-9-1 15:04
要理解这个问题,最好的方法就是从Java的源代码进行说明。
我从中截取一部分有用的代码进行说明:private R ...

nice!正解!问题已解决,谢谢各位大侠!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马