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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯龙辉 黑马帝   /  2011-8-8 16:45  /  2503 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在通过继承Thread创建的线程和通过实现Runnable接口创建的线程有什么区别吗?什么情况下使用继承Thread创建的线程,什么情况下使用实现Runnable接口创建的线程?

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1 看看楼下的回答!

查看全部评分

3 个回复

正序浏览
黑马网友  发表于 2011-8-10 08:48:13
板凳

Thread类,Runnable接口

用Thread类创建线程
  1 要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是
Thread类的子类。倒过来看:我们要实现多线程,必须编写一个继承了Thread类的子类,子类覆盖了
Thread的run()函数,在子类的函数中调用想在新线程上运行的程序代码。

2 启动一个新的线程我们不是直接调用Thread的子类的run()方法,而是调用Thread子类对象的start方
法,start()方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run()方法,根据面向对象
的运行时的多态性,在该线程上实际运行的是Thread子类对象的run()方法。

3由于线程的代码段在run方法中,那么该方法执行完成以后线程也就相应的结束了,因而我们可以通过
控制run方法中的循环条件来控制线程的结束。

使用Runnable 接口创建多线程

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

2 可以避免由于java的单继承特性带来的局限。我们将已经继承了一个类的子类放入多线程,由于不能
有两个父类,就不能继承Thread,那么这个类就只能实现Runnable接口。

3 当线程被构造时,需要的代码和数据通过一个对象作为 构造函数的实参传递进去,这个对象就是实现
了Runnable接口的类的实例。

4 事实上,几乎所有的多线程应用都可用Runnable接口方式。
回复 使用道具 举报
黑马网友  发表于 2011-8-10 06:22:07
藤椅
一般用接口实现,别为了省点事就用继承。继承让类与类之间藕合度变低
回复 使用道具 举报
其实大部分我们用到线程的时候,用哪个都行。偶尔会有不同的时候,我举个我遇到过的例子[code=java]class MyThread extends Thread{
        private int ticket = 5;
        public void run(){
                for(int i = 0; i < 5; i++){
                        if(this.ticket > 0){
                        System.out.println("卖票:ticket = "+this.ticket--);
                        }
                }
        }
}
public class ThreadDemo{
        public static void main(String args[]){
                MyThread mt1 = new MyThread();         
                MyThread mt2 = new MyThread();         
                MyThread mt3 = new MyThread();
                mt1.start();
                mt2.start();
                mt3.start();
        }
}[/code]输出
卖票:ticket = 5
卖票:ticket = 4
卖票:ticket = 3
卖票:ticket = 2
卖票:ticket = 1
卖票:ticket = 5
卖票:ticket = 4
卖票:ticket = 3
卖票:ticket = 5
卖票:ticket = 2
卖票:ticket = 4
卖票:ticket = 1
卖票:ticket = 3
卖票:ticket = 2
卖票:ticket = 1[code=java]class MyThread2 implements Runnable{
        private int ticket=5; //一共才5张票
        public void run(){ //复写run()方法
                for(int i=0;i<50;i++){
                        if(this.ticket>0){
                        System.out.println("卖票:ticket ="+this.ticket--);
                        }
                }
        }
}
public class RunnableDemo{
        public static void main(String args[]){
                MyThread2 mt = new MyThread2();
                  new Thread(mt).start();
                  new Thread(mt).start();
                  new Thread(mt).start();
        }
}[/code]输出
卖票:ticket =5
卖票:ticket =3
卖票:ticket =4
卖票:ticket =1
卖票:ticket =2
第一个例子里三个线程是彼此独立的,三个窗口各有5张票,各卖各的票,互不干扰
第二个例子里三个线程共享一段代码,相当于三个窗口一起卖5张票
[ 本帖最后由 赵侃 于 2011-08-09  00:30 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 还有点没有提到。

查看全部评分

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