黑马程序员技术交流社区

标题: 实现Runnable方法创建线程的问题 [打印本页]

作者: 王世虎    时间: 2014-11-9 03:35
标题: 实现Runnable方法创建线程的问题
本帖最后由 王世虎 于 2014-11-9 03:38 编辑

   半夜学习遇到点问题希望高手指点,视频里面好像没讲

下面是API文档对创建线程一种方法是声明实现 Runnable 接口的类的说明


创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:


     class PrimeRun implements Runnable
{      
                     long minPrime;      
                      PrimeRun(long minPrime)
                      {            
                          this.minPrime = minPrime;      
                          }         
                        public void run()
                      {             // compute primes larger than minPrime            
                                    . . .      
                        }   
  }

然后,下列代码会创建并启动一个线程:

                   PrimeRun p = new PrimeRun(143);   
                   new Thread(p).start();
此处有疑问,为什么可以直接new Thread(p),我知道这是Thread类的一个构造函数,我想问的是在此处为什么能直接创建Thread类的构造函数?
API文档在对Thread类说明的时候提到Thread类以实现接口Runnable,这对于此处调用有没有影响?
或者说是Thread类自身有像Object类一样 可以在其他类中直接new一个构造函数?因为此处PrimeRun类只是implements Runnable并没有extends Thread
还有,是不是和线程代码存放的位置有关?实现 Runnable,代码存放在接口的子类的run方法中。
求大神帮忙解释,折腾半夜……


作者: 陈召    时间: 2014-11-9 06:58
额,好高深的样子。。
作者: cbb    时间: 2014-11-9 08:22
不太懂~~~收藏等答案~~~
作者: javaAndroid    时间: 2014-11-9 10:27
不太明白楼主的意思。
在此处为什么能直接创建Thread类的构造函数?
那个构造函数你也知道啊
是他自己的构造函数
参数是一个实现了Runnable接口的类
需要放在线程中运行的代码全部都放在该类的run方法中。
new Thread(p).start()这句创建了一个匿名线程对象并启动
相当于Thread t=new Thread(p);
t.start();
意思是
创建一个新的线程,任务是执行p实例中run方法中的内容
start表示创建好了就启动该线程
线程会自动去调用实例的run方法。
然后等待cpu去执行。
可以多看看几遍视频。
作者: 王世虎    时间: 2014-11-9 12:56
javaAndroid 发表于 2014-11-9 10:27
不太明白楼主的意思。
在此处为什么能直接创建Thread类的构造函数?
那个构造函数你也知道啊

谢谢,你说的我明白。是不是Thread类的权限很大,别的类可以直接创建其构造函数。因为没有声明继承Thread类或者是导入包等
作者: OCTSJimmy    时间: 2014-11-9 13:31
其实可以这么理解:
public class Thread{
   private Runnable rb;
   public Thread(Runnable rb){
       this.rb = rb;
   }
   public void start(){
         ...
         rb.run();//这个是由接口实现的代码,直接调用
         ...
   }
}
Thread有类似这样的代码,所以只要你实现了接口,并传入接口的对象,它就可以调用接口中必需实现的方法了。
作者: jacoblx    时间: 2014-11-9 13:39
王世虎 发表于 2014-11-9 12:56
谢谢,你说的我明白。是不是Thread类的权限很大,别的类可以直接创建其构造函数。因为没有声明继承Thread ...

构造函数是他自己本身有的,可以去查API。Thread类是Java.lang包中的,所以不需要导包啊,就像你用String类也不用导包一样啊。

没有什么别的类创建构造函数一说,构造函数都是每个类本身定义好的。
作者: 王会涛    时间: 2014-11-9 13:42
创建线程的第二种方式:实现Runable接口
步骤:
1.定义类实现Runable接口
2.覆盖Runable接口中的run方法;
将线程要运行的代码存放在该run方法中;
3.通过Thread类建立线程对象;
4.将Runable接口的子类对象作为实际参数传递给Thread类的构造函

数;
为什么要将Runable接口的子类对象传递给Thread的构造函数;
因为自定义的run方法所属的对象是Runnable接口的子类对象。
所以要让线程去指定对象的run方法;

怎么可以说是创建Thread类的构造函数呢?创建的是有参或者空参的构造函数的对象,为什么能直接穿件,因为Thread的类是java定义好的,你当然可以new一个对象,楼主理解有点歪了,再想想就理解了
作者: diaolinan    时间: 2014-11-9 14:41
表示不懂,创建构造函数?
作者: 王世虎    时间: 2014-11-9 21:46
王会涛 发表于 2014-11-9 13:42
创建线程的第二种方式:实现Runable接口
步骤:
1.定义类实现Runable接口

我确实理解的有点歪了,较真了。毕老师讲的很明白了,不过偶尔看API文档还是有点疑惑,努力学习中。谢谢大家帮助~~
作者: 王世虎    时间: 2014-11-9 21:47
jacoblx 发表于 2014-11-9 13:39
构造函数是他自己本身有的,可以去查API。Thread类是Java.lang包中的,所以不需要导包啊,就像你用String ...

多写指点,谢谢~~
作者: yaodd321    时间: 2014-11-10 00:33
边看回复边学习
作者: 王世虎    时间: 2014-11-10 11:45
yaodd321 发表于 2014-11-10 00:33
边看回复边学习

大家多交流,互相学习~~
作者: zhangyangLengen    时间: 2014-11-10 11:59
你要创建线程,肯定要创建线程的对象,但是如何将任务和线程对象进行有效的分离,这个是关键;




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