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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李节起 中级黑马   /  2012-4-9 11:31  /  3048 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

实现多线程有两种方法:
分别是通过Thread类的子类来实现和通过实现Runnable接口来实现。
:time:
他们之间有什么区别呢 ?
什么情况需要用通过Thread类的子类来实现,什么情况需要需要通过实现Runnable接口来实现?



7 个回复

倒序浏览
java实现多线程有两种方法:
一种是继承Thread类

如下面例子:
public class TestThread extends Thread {

//实现多线程方法一:继承Thread类,并重载run方法
public void run(){
  //要将一段代码在一个新的线程上运行,该代码应写在run函数中
  while(true){
   System.out.println(Thread.currentThread().getName() + "is running...");
  }
}
}



public class ThreadDemo2 {

public static void main(String[] args) {
  
  //启动一个新的线程,不是直接调用Thread类子类对象的run方法,
  //而是调用Thread类子类对象的start方法,Thread类对象的start方法
  //将产生新的线程,并在该线程上运行该Thread类对象中的run方法,根据
  //多态性 实际上运行的是Thread子类的run方法
  TestThread testThread = new TestThread();
  testThread.start();
  
  while(true){
   System.out.println("main thread is running...");
  }
}

}



方法二是:实现接口Runnable中的run函数

如下列所示

//实现多线程方法二:实现Runnable接口,重载run函数,
//大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,
//那么应使用 Runnable 接口。这很重要,
//因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。
public class TestThread implements Runnable {

public void run() {
  // TODO Auto-generated method stub
  System.out.println(Thread.currentThread().getName() + "is running......");
}

}


public static void main(String[] args) {
  // TODO Auto-generated method stub
  TestThread testThread = new TestThread();//创建TestThread类的一个实例
  Thread thread = new Thread(testThread);//创建一个Thread类的实例
  thread.start();//使线程进入runnable状态
  
  while(true){
   System.out.println("main thread is running...");
  }
}

这两种方法的区别:实现Runnable接口适合多个相同的程序代码访问处理同一资源
回复 使用道具 举报
实现Runnable接口相对于继承Thread类来说,有如下的显著优势:
   1.适合多个相同代码的线程去处理同一个资源的情况
   2.可以避免由于java的单继承特性带来的局限
   3.增强了程序的健壮性,代码能够被多个线程共享,代码与数据时独立的

给你个例子,你自己取运行就知道了,好好对比下
class MyThread extends Thread{        // 继承Thread类,作为线程的实现类
        private int ticket = 5 ;                // 表示一共有5张票
        public void run(){        // 覆写run()方法,作为线程 的操作主体
                for(int i=0;i<100;i++){
                        if(this.ticket>0){
                                System.out.println("卖票:ticket = " + ticket--) ;
                        }
                }
        }
};
public class ThreadDemo0{
        public static void main(String args[]){
                MyThread mt1 = new MyThread() ;         // 实例化对象
                MyThread mt2 = new MyThread() ;         // 实例化对象
                MyThread mt3 = new MyThread() ;         // 实例化对象
                mt1.run() ;        // 调用线程主体
                mt2.run() ;        // 调用线程主体
                mt3.run() ;        // 调用线程主体
        }
};


class MyThread implements Runnable{        // 继承Thread类,作为线程的实现类
        private int ticket = 5 ;                // 表示一共有5张票
        public void run(){        // 覆写run()方法,作为线程 的操作主体
                for(int i=0;i<100;i++){
                        if(this.ticket>0){
                                System.out.println("卖票:ticket = " + ticket--) ;
                        }
                }
        }
};
public class RunnableDemo0{
        public static void main(String args[]){
                MyThread mt = new MyThread() ;         // 实例化对象
                new Thread(mt).run() ;        // 调用线程主体
                new Thread(mt).run() ;        // 调用线程主体
                new Thread(mt).run() ;        // 调用线程主体
        }
};
回复 使用道具 举报
两个的运行结果是全然不同了,你看了例子你就理解实现Runnable接口相对于继承Thread类的优势了!
回复 使用道具 举报
这两种方法的区别:
1.继承Thread来创建线程类的方法,在继承了Thread后,不能再继承其他类,这样灵活性就不如实现Runnable接口来创建线程类的方法了。
2.正如上面所说的使用实现Runnable接口来创建线程类的方法可以达到资源共享。(在这里说明一下:继承Thread类来创建线程类的方法也可以实现资源共享,只不过比较麻烦。因此,在创建线程类的时候,应优先选择实现Runnable接口来创建线程类的方法。)
回复 使用道具 举报
实现多线程有两种方法,一是继承Thread类,二是实现Runnable接口。

  Thread类创建线程时,首先要定义一个Thread类的子类,并在该子类中重写run()方法。
run()方法是线程体,说明该线程的具体操作。需要创建线程时,
只需创建该子类的对象再调用其start()方法。

  实现Runnable接口创建线程必须重写该接口的run()方法。

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

回复 使用道具 举报
pray 高级黑马 2014-4-26 07:40:06
8#
在遇到你之前,我对人世间是否有真正的圣人是怀疑的;而现在,我终于相信了!我曾经忘情于汉廷的歌赋,我曾经惊讶于李杜的诗才,我曾经流连于宋元的词曲;但现在,我才知道我有多么浅薄!  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马