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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田建 高级黑马   /  2012-6-4 10:46  /  1916 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田建 于 2012-6-6 10:27 编辑

创建线程有两种方式,一种是extends Thread,然后覆写其中的run方法;另一种方式是implements Runnable,然后覆盖Runnable接口中的run方法,想请问一下,这两种方式到底有什么本质的区别!

5 个回复

正序浏览
通过继承Thread类实现多线程。

缺点:Java程序只允许单一继承,即一个子类只能有一个父类,所以在java中如果一个类继承了某一个类,同时又想采用多线程技术的时,就不能用Thread类产生线程,因为java不允许多继承。同时用这种方式不能处理同一个资源。

通过实现Runnable接口实现多线程。

用Runnable接口的优势:

(1):适合多个相同程序代码的线程去处理统一资源的情况,把虚拟cpu(线程) 同程序的代码,数据有效分离,较好的体现了面向对象的设计思想.

(2):可以避免由于Java的单继承特性带来的局限.开发中经常碰到这样一种情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了.

(3):增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的,当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码.多个线程可以操作相同的数据,与它们的代码无关.当共享访问相同的对象时,即共享相同的数据.当线程被构造时,需要的代码和数据通过一个对象作为构造方法实参传递进去,这个对象就是一个实现了Runnable接口的类的实例.

具体可以看下 下面的帖子

http://bbs.itheima.com/forum.php?mod=viewthread&tid=15642&fromuid=21261
回复 使用道具 举报
本质还是Java单继承的局限性和实现接口的扩展性。接口是一种规范,但是程序员实现它就比较灵活,可以有自己的实现方式。可以实现接口就少用继承。
回复 使用道具 举报
本帖最后由 杨永峰 于 2012-6-4 11:04 编辑

我的理解:当一个类已经存在继承关系时,则无法再继承Tread类,这时可以实现runnable接口。
extends Thread方式:继承 Thread 的类中的start()方法中调用的是本类的run方法。
implements Runnable 方式:Thread 类的对象在创建时,通过构造方法接收一个runnable子类对象,Tread对象里的其他东东应该没有太大的变化,只不过在调用start()时,start()中调用的是runnable子类对象.run();而不是直接this.run();
thread类和其start()其他细节实现略去。
回复 使用道具 举报
建议楼主看看相关帖子:里面说的很清楚
创建线程的第一种方式:继承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方法。就必须明确该run方法所属对象。


5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。

实现方式好处:避免了单继承的局限性。在定义线程时,使用实现方式比较好。

两种方式区别:
一:继承Thread:线程代码存放Thread子类run方法中。
    实现Runnable,线程代码存在接口的子类的run方法。
二:一种是扩展java.lang.Thread类
    另一种是实现java.lang.Runnable接口
回复 使用道具 举报
看看视频吧;老毕说的很清楚;
当你extends后还能继承吗?用impelments runnable之后就可易继承其他的类;
这是为了克服java单继承而做出的方法;所以一般继承runnable接口;extends继承你的主要类
这样这个类就可以多线程操作了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马