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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kongling 中级黑马   /  2013-12-4 17:56  /  1430 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 kongling 于 2013-12-5 17:44 编辑

Thread 与 Runnable的区别

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

3 个回复

倒序浏览

创建线程有两种方式:继承Thread类和实现Runable接口

创建线程的第一种方式:继承Thread类
步骤:
    1,定义类继承Thread
    2,复写Thread类中的run方法
              目的:将自定义代码存储在run方法,让线程运行
    3,调用线程start方法
            该方法两个作用:启动线程,调用run方法

创建线程的第二种方式:实现Runable接口
步骤:
1,定义类实现Runnable接口。
2,覆盖Runnable接口中的run方法。
    将线程要运行的代码存放在run方法中。
3,通过Thread类建立线程对象。
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
    为什么要将Runnable的子类对象传递给Thread的构造函数。
    因为,自定义的run方法所属的对象是Runnable接口的子类对象。
    所以要让线程去执行指定对象的run方法
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。


实现Runable接口方式和继承继承Thread类方式有什么区别呢?
实现方式好处:避免了单继承的局限性。
在定义线程时:建议使用实现方式。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
在Java中有两种创建线程的方式,一种是直接继承Thread类,另一种是实现Runable接口的方式。

区别: 1,Thread类是在java.lang包中定义的,任何一个类只要继承了Thread类同时覆写了本类中的

run()方法就可以实现多线程操作。局限性:一个类只能继承一个父类,实际开发中一般使用少

           2,定义类实现Runnable接口,覆盖Runnable接口中的run方法,通过Thread类建立线程对象,调用Thread类的start方法开启线程。但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。优点:可以避免上面方法的继承的局限,一个类可以继承多个接口,适合于资源的共享。


总结:从结构上来看,确实第一种比第二种方法要简洁很多,第二种虽然相对复杂些,却可以更优的在实际编程中起作用,所以建议尽量使用实现Runnable接口

评分

参与人数 1技术分 +1 收起 理由
简★零度 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 王家胜 于 2013-12-5 16:33 编辑

别看字多,我觉得上面的回答都不好
我来将sun公司原代关键提取出啦
  1. private Runnable target;
  2. public Thread(Runnable target)
  3. {
  4.         init(参数1.......);
  5. }
  6. private void init(局部变量)
  7. {
  8.            this.target = target;
  9. }
  10. public synchronized void start()
  11. {
  12.        start0();//这是jni 最终让操作系统启动一个线程执行 run()

  13. public void run()
  14. {
  15.      if (target != null)
  16.      {
  17.            target.run();
  18.      }
  19. }
复制代码


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马