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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李桐 高级黑马   /  2012-11-13 22:14  /  1815 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李桐 于 2012-11-14 11:01 编辑

想问一下线程继承Thread类和实现Runnable接口用法有什么不一样,什么时候用什么?
public class Test {
        public static void main(String[] args) {
                new TestThread1().start();
                TestThread2 tt = new TestThread2();
                new Thread(tt).start();
        }
}
class TestThread1 extends Thread{
        public void run(){
                for(int i = 0;i<=10;i++)
                        System.out.println("继承Thread");
        }
}
class TestThread2 implements Runnable{
        public void run(){
                for(int i = 0;i<=10;i++)
                        System.out.println("实现Runnable接口");
        }
}

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

7 个回复

倒序浏览
为什么要继承Thread类?因为自己实现不了,所以,定义类继承Thread后,就是线程类的体系一员,就可以完成多线程的程序。
为什么会出现接口的方式呢?因为一个类一旦继承了一个类,还想实现多线程,就违反了java的单继承原则, 所以,为了让这个类能够实现多线程,用接口即可。
Runnable接口的出现避免了单继承的局限性,将线程的代码都单独封装到接口对象,实现了解耦,这种方式更为常用

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为java只能实现单继承,如果继承Thread类之后,程序的扩展性就降低,因为无法继承其他类了,而如果是实现Runnable接口的话,程序的扩展性就像对于继承Thead要高一些,因为该类还可以继承其他的类,所以编写程序最好要做到面向接口编程

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
使用Runnable接口:
可以将CPU,代码和数据分开,形成清晰的模型
可以从其他类继承;
保持程序风格的一致性。

直接继承Thread类:
不能再从其他类继承;
编写简单,可以直接操纵线程,无需使用Thread.currentThread()返回对当前执行的线程引用

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 廖智 于 2012-11-14 01:47 编辑

1、实现Runnable接口能提高程序的扩展性,因为java是单继承的,如果以继承Thread,那就不能继承别的父类了,这样不利于描述。
而java支持多实现。
2、实现Runnable可以将线程任务和线程对象分开,降低线程对象和线程任务之间的耦合性。
建议写多线程都以实现Runnable接口的方式来完成。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
线程类只能单继承的,但是接口是实现接口的,使用接口解决了java中单继承的问题
回复 使用道具 举报
两种方式区别:
继承Thread: 线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法。
实现Runnable接口相对于继承Thread类来说,有如下的显著优势:
   1.适合多个相同代码的线程去处理同一个资源的情况
   2.可以避免由于java的单继承特性带来的局限
   3.增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的
简单总结:
1、当使用继承的时候,主要是为了不必重新开发,并且在不必了解实现细节的情况下拥有了父类我所需要的特征。它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类,
2、java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么太大的区别。
3、implement Runnable是面向接口,扩展性等方面比extends Thread好。
4、使用 Runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装,它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 Thread 来得紧凑。


回复 使用道具 举报
简单的来说,就是继承和实现接口的区别。
1、当使用继承的时候,主要是为了不必重新开发,并且在不必了解实现细节的情况下拥有了父类我所需要的特征。它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类,
2、java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没太大区别。
3、implement Runnable是面向接口,扩展性等方面比extends Thread好。
4、使用 Runnable 接口来实现多线程使得我们能够在一个类中包容所有的代码,有利于封装。它的缺点在于,我们只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类,如果这样的话,在大多数情况下也许还不如直接用多个类分别继承 Thread 来得紧凑。
回答完毕。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马