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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王世虎 中级黑马   /  2014-11-9 03:35  /  2093 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王世虎 于 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方法中。
求大神帮忙解释,折腾半夜……

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 淡定

查看全部评分

13 个回复

倒序浏览
额,好高深的样子。。
回复 使用道具 举报
不太懂~~~收藏等答案~~~
回复 使用道具 举报
不太明白楼主的意思。
在此处为什么能直接创建Thread类的构造函数?
那个构造函数你也知道啊
是他自己的构造函数
参数是一个实现了Runnable接口的类
需要放在线程中运行的代码全部都放在该类的run方法中。
new Thread(p).start()这句创建了一个匿名线程对象并启动
相当于Thread t=new Thread(p);
t.start();
意思是
创建一个新的线程,任务是执行p实例中run方法中的内容
start表示创建好了就启动该线程
线程会自动去调用实例的run方法。
然后等待cpu去执行。
可以多看看几遍视频。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
javaAndroid 发表于 2014-11-9 10:27
不太明白楼主的意思。
在此处为什么能直接创建Thread类的构造函数?
那个构造函数你也知道啊

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

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

没有什么别的类创建构造函数一说,构造函数都是每个类本身定义好的。
回复 使用道具 举报
创建线程的第二种方式:实现Runable接口
步骤:
1.定义类实现Runable接口
2.覆盖Runable接口中的run方法;
将线程要运行的代码存放在该run方法中;
3.通过Thread类建立线程对象;
4.将Runable接口的子类对象作为实际参数传递给Thread类的构造函

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

怎么可以说是创建Thread类的构造函数呢?创建的是有参或者空参的构造函数的对象,为什么能直接穿件,因为Thread的类是java定义好的,你当然可以new一个对象,楼主理解有点歪了,再想想就理解了

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
表示不懂,创建构造函数?
回复 使用道具 举报
王会涛 发表于 2014-11-9 13:42
创建线程的第二种方式:实现Runable接口
步骤:
1.定义类实现Runable接口

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

多写指点,谢谢~~
回复 使用道具 举报
边看回复边学习
回复 使用道具 举报

大家多交流,互相学习~~
回复 使用道具 举报
你要创建线程,肯定要创建线程的对象,但是如何将任务和线程对象进行有效的分离,这个是关键;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马