黑马程序员技术交流社区

标题: 创建线程调用run方法的问题 [打印本页]

作者: 黑马--张帅    时间: 2012-9-1 13:18
标题: 创建线程调用run方法的问题
本帖最后由 黑马--张帅 于 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方法?具体的调用过程是怎样的?

作者: 阳杰    时间: 2012-9-1 13:36
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行
作者: 广驰    时间: 2012-9-1 15:02
在Thread中有一个构造函数,是接受Runnable类对象的然后创建线程,然后调用Runnable的run方法,你的Demo1继承了Runnable类,所以当d作为参数建立Thread对象时,d中的润run方法就覆盖了Thread的run方法,毕老师的视频里面有讲的,你仔细看看,或者自己查看API文档看看
作者: 郑义    时间: 2012-9-1 15:04
要理解这个问题,最好的方法就是从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方法的内容。


作者: 黑马--张帅    时间: 2012-9-1 15:46
郑义 发表于 2012-9-1 15:04
要理解这个问题,最好的方法就是从Java的源代码进行说明。
我从中截取一部分有用的代码进行说明:private R ...

nice!正解!问题已解决,谢谢各位大侠!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2