黑马程序员技术交流社区

标题: 求大神解惑 [打印本页]

作者: pifuhanshu    时间: 2014-3-11 08:10
标题: 求大神解惑
本帖最后由 pifuhanshu 于 2014-3-21 18:28 编辑

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

作者: 630681386@qq.co    时间: 2014-3-11 08:45
你看看张孝祥老师的线程并发库视频第一集和第二集,你就明白了
作者: 不冬眠的蚂蚁    时间: 2014-3-11 11:17
继承thread类的话就只能单继承了 类的功能有一定局限性
但是实现runnble接口就不一样了 你可你在继承一个类的基础上 在实现了runnable的基础上 还可以去实现别的接口,所以还是后者比较好,可以多实现的 类的功能会变得很强大
作者: 胡文彬    时间: 2014-3-11 14:12
其实你想问的问题是:继承和实现接口有什么区别?为什么我们常用实现接口的方式去实现线程呢?先从线程的本身特点说起,线是一个具有主函数(也叫主线程)的被jvm执行的功能,他与一般函数不一样,你写一个函数放在类里,这个 函数需要被线程调用才执行,也就是说,jvm只是执行主线程,换句话说cpu在线程中轮转。所以线程是一个执行路径(专业术语),比如:你可以定义一个Computer类,里面有听音乐,看电影的功能函数的功能,你呢,想让他们同时执行,那你必须要用到多线程技术,就是在你的computer类中实现两天执行路径。<font color=red>如果你让computer继承Thread,则computer是Thread体系中的了</font>,可以觉得Computer类和Thread没什么关系,所以你可以实现Runnable接口了,这就是区别
作者: 蒋珍珍    时间: 2014-3-12 13:07
这两种都只是我们创建线程的一种方式,至于区别我认为就是哪一种方式更好而已。
所以在选择创建线程的方式时,一般建议的是使用实现Runnable接口的方式。
这样选择的好处是:
1、可以避免由于Java的单一继承带来的局限;
2、可以将同一个Runnable工作放入不同的线程中运行,达到不同线程共享相同的变量资源。
例如:两个业务员可以销售同一家公司的产品,多个火车票代售点可以出售同一车次的车票。:)

作者: 水蓝    时间: 2014-3-12 22:55
无论是实现Runnable方法,还是继承Thread类,其实都是可以的。

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

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

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


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





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