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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© pifuhanshu 中级黑马   /  2014-3-11 08:10  /  1637 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 pifuhanshu 于 2014-3-21 18:28 编辑

最近在学线程,有点疑惑:可以定义一个类继承thread类,也可以定义一个类实现Runnable接口。这两种方法实现类在线程调用中有什么区别?

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

5 个回复

正序浏览
无论是实现Runnable方法,还是继承Thread类,其实都是可以的。

主要还是看你对对象的设计需求。
Runnable的一个例子:
比如:让设计一个动物的类继承体系,猫、狗、兔子,都继承于动物,且都有“吃”这个方法:

如果要让多只狗狗同时在“吃”,那么,多线程,显然是首选实现方式。

但JAVA的集成体系是单根的,也就是只有一个父节点。“猫”、“狗”、“兔子”都已经继承了“动物”这个父类,显然再想继承Thread是不可能的。
所以只能用Runnable接口,实现run()方法后,再交给Thread去运行。
这样的优点,就是不破坏类本身的继承体系。
也是你以后在工作中,相对于继承Thread类来说,更加优选的方案。


至于继承Thread类,我就不赘述啦。大家都懂的。如果确定这个类本身就是一个线程类,那直接继承Thread是完全可以的。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
这两种都只是我们创建线程的一种方式,至于区别我认为就是哪一种方式更好而已。
所以在选择创建线程的方式时,一般建议的是使用实现Runnable接口的方式。
这样选择的好处是:
1、可以避免由于Java的单一继承带来的局限;
2、可以将同一个Runnable工作放入不同的线程中运行,达到不同线程共享相同的变量资源。
例如:两个业务员可以销售同一家公司的产品,多个火车票代售点可以出售同一车次的车票。:)

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
其实你想问的问题是:继承和实现接口有什么区别?为什么我们常用实现接口的方式去实现线程呢?先从线程的本身特点说起,线是一个具有主函数(也叫主线程)的被jvm执行的功能,他与一般函数不一样,你写一个函数放在类里,这个 函数需要被线程调用才执行,也就是说,jvm只是执行主线程,换句话说cpu在线程中轮转。所以线程是一个执行路径(专业术语),比如:你可以定义一个Computer类,里面有听音乐,看电影的功能函数的功能,你呢,想让他们同时执行,那你必须要用到多线程技术,就是在你的computer类中实现两天执行路径。<font color=red>如果你让computer继承Thread,则computer是Thread体系中的了</font>,可以觉得Computer类和Thread没什么关系,所以你可以实现Runnable接口了,这就是区别

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
继承thread类的话就只能单继承了 类的功能有一定局限性
但是实现runnble接口就不一样了 你可你在继承一个类的基础上 在实现了runnable的基础上 还可以去实现别的接口,所以还是后者比较好,可以多实现的 类的功能会变得很强大

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
你看看张孝祥老师的线程并发库视频第一集和第二集,你就明白了

评分

参与人数 2技术分 +1 黑马币 +14 收起 理由
朱神必 + 1
pifuhanshu + 14

查看全部评分

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