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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张宏祚 中级黑马   /  2013-11-1 09:53  /  2767 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张宏祚 于 2013-11-1 19:07 编辑

既然通过Thread类和实现Runnable接口都可以实现多线程操作,为什么要留两个呢?提供一个Thread接口,然后复写里面的run方法,实现多线程多简便啊?希望有朋友用简洁清晰的语言总结一下二者的区别以及互补之处。谢啦!

评分

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

查看全部评分

6 个回复

倒序浏览
某个类如果继承了某个功能类,还想实现多线程,那么如果只有继承Thread这一种方法的话,那么就不可行了,因为java是不支持多继承的,就是说如果你继承了别的类,就别想实现多线程,如果你想实现多线程,就别想同时继承别的类,这就有了对类的拓展有了非常大的局限性
为了弥补这个局限性,就提供了实现Runnable接口,也可以实现多线程的方法,让你在继承别的类的同时,还可以实现接口,并且接口可以多实现
说到这,可能还不太明白,为什么Runnable接口可以实现多线程,到底是怎么实现的呢
可以带你看一下Thread的源码
Thread类的内部实现应该是如下这样
  1. Public class Thread extends Object
  2. {
  3.         Runnable target = null;//声明一个Runnable引用;
  4.         Thread()//空参数构造函数
  5.         {}
  6.         Thread(Runnable target)
  7.         {
  8.         This.target = target;
  9.         }
  10.         Void run()
  11.         {
  12.                 If(target!=null)   //如果传入了对象,就调用传入对象的run()
  13.                 {
  14.                 target.run();
  15.                 }
  16.         }
  17. }
复制代码
其实这样更好理解继承Thread类和实现Runnable 开辟线程的不同之处
如果是继承Thread,则要重写run方法,实现自己定义的线程方法
如果是实现Runnable,在Thread构造函数中传入子类对象呢?则如上代码,虽说没有覆盖,但是Thread的Run方法里面还是通过传入的子类对象调用自定义run方法
其实归根结底,还是Thread创建的线程

评分

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

查看全部评分

回复 使用道具 举报
根据面向对象思维,万物皆对象,将其抽象也就有了类,线程那就有自己的属性与行为
接口,是规范,某种意义上说是共性功能的抽取,只设计了Thread接口,那么线程本身
的行为是抽取出来还是删掉呢,他本身的属性呢,怎么办?
实现Runnable接口相对于继承Thread类有三点显著优势:
(1)适合多个相同程序代码去处理同一资源
(2)避免单继承的局限性
(3)增强了程序开发的健壮性,代码能够被多个线程共享,数据域代码是独立的

希望对楼主有用,不对之处,大家多多指正

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 FFF 于 2013-11-1 11:00 编辑

Thread是类,Runnable是接口。不同概念的。
这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
    其实在实现一个任务用多个线程来做也可以用继承Thread类来实现只是比较麻烦,一般我们用实现Runnable接口来实现,简洁明了。
    大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。
学学毕老师、。放张图给你看看:
新鲜热辣刚刚画的~嘿嘿~

未命名.JPG (43.59 KB, 下载次数: 60)

未命名.JPG

评分

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

查看全部评分

回复 使用道具 举报

           1.Runnable接口可以避免单继承的限制,要是继承Thread类的话,那么就不能继承其他的类了,因为只能单继承,如果实现了接口Runnale后,还可以继承其他的类,或是是实现其他的接口

     2.Runnable实现了资源的共享,例如(售票程序的票)

     3.Runnable实增强了程序的健壮性,代码能够被多个程序共享,实现了数据 与代码是独立的。

     4.实现Runnable接口的线程的运行代码存在实现Runnable接口子类的run()方法中,继承Thread类的线程的代码存在Thread子类的run()方法中。

  所以在以后的开发中,使用Runnble接口比较好,更多。


回复 使用道具 举报
杨增坤 发表于 2013-11-1 12:13
1.Runnable接口可以避免单继承的限制,要是继承Thread类的话,那么就不能继承其他的类了,因为 ...

请教一下,能把Runnable实现资源共享再详细讲讲么,还有
“  4.实现Runnable接口的线程的运行代码存在实现Runnable接口子类的run()方法中,继承Thread类的线程的代码存在Thread子类的run()方法中。”
这俩点,看完视频后理解不是太透彻

评分

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

查看全部评分

回复 使用道具 举报
Gump 发表于 2013-11-1 17:08
请教一下,能把Runnable实现资源共享再详细讲讲么,还有
“  4.实现Runnable接口的线程的运行代码存在实 ...

就是代码存在的位置不同,都在各自重写的方法中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马