去面试的面试官问我,我也说不清楚具体什么区别,大家怎么看待这个问题呢

解决方案 »

  1.   

    没区别,本质上是一样的。但是,java语言只支持单继承,但是可以实现多个接口,因此,实现接口相对来说比较灵活!
      

  2.   

    这个恶心的问题,主要是性能的问题
    MyThread myThread = new MyThread();
    myThread.start();
    而实现借口呢:
    MyRunable myRunnable = new myRunnable();
    MyRunable myRunnable1 = new myRunnable();
    MyRunable myRunnable2 = new myRunnable();
    Thread thread = new Thread();
    thread(myRunnable).start();
    thread(myRunnable1).start();
    thread(myRunnable2).start();
    对于继承的就必须new一个新的Thread实现类,而继承只需要一个就够了
    另一种说法就是你既然继承了,但是你还要再继承其他的类的话就不可以了
      

  3.   

    我觉得还有一点就是:继承Thread类的线程实例只能启动一个线程;
    实现Runnable接口的线程实例可以启动多个线程.
      

  4.   

    其实主要问题是java 只支持单继承  所以你懂了么?
      

  5.   

    其实是一种方法:即实现了Thread类的run()方法.只不过一个是通过继承中通过方法覆盖的方式实现,另外一个是Thread类的默认的run()方法实现:如果该线程对象是用实现Runable接口的对象创建的,那么就调用这个Runable接口对象的run()方法
      

  6.   

    就实质来说,Thread类也是通过实现runnable接口来实现功能的。
    就应用来说,实现Runnable接口比继承Thread类更优质,很多高人如是说。
    还有,#5楼的代码是错的,编译都不会通过……
    #6楼说的有点意思,通过实现Runnable接口的run()方法可以用于多个由它构造的线程实例,而写在Thread子类中的run()方法只能被它自己用。
      

  7.   

    如果一个类通过继承Thread来实现多线程的话,则不适合多个线程共享资源,而通过实现Runnable就可以做到这一点,下面给lz举个例子:class MyTheard extends Thread{
    private int num = 5;//不能声明为静态的全局变量
    public void run(){
    for(int i=0;i<100;i++){
    if(num>0){
    System.out.println(Thread.currentThread().getName()+"卖票"+":"+(num--));
    }
    }
    }
    }public class TheardDemo01 {
    public static void main(String[] args) {
    MyTheard th1 = new MyTheard();
    MyTheard th2 = new MyTheard();
    MyTheard th3 = new MyTheard();
    th1.start();
    th2.start();
    th3.start();
    }}
    输出结果:
    Thread-0卖票:5
    Thread-0卖票:4
    Thread-0卖票:3
    Thread-0卖票:2
    Thread-0卖票:1
    Thread-2卖票:5
    Thread-2卖票:4
    Thread-2卖票:3
    Thread-2卖票:2
    Thread-2卖票:1
    Thread-1卖票:5
    Thread-1卖票:4
    Thread-1卖票:3
    Thread-1卖票:2
    Thread-1卖票:1class MyThread implements Runnable
    {
    private int num = 5;
    public void run(){
    for(int i = 0;i<100;i++){
    if(num>0){
    System.out.println(Thread.currentThread().getName()+"卖票:"+" "+(num--));
    }
    }
    }
    };public class ThreadDemo02 
    {
    public static void main(String[] args) 
    {
    MyThread mt = new MyThread();
    new Thread(mt).start();
    new Thread(mt).start();
    new Thread(mt).start();
    }
    }
    输出结果:
    Thread-1卖票: 5
    Thread-1卖票: 2
    Thread-1卖票: 1
    Thread-0卖票: 4
    Thread-2卖票: 3
    总结:
    通过Rannable接口实现接口有如下的好处:
    (1)适合于多个相同的程序代码的线程去处理同一资源。
    (2)可以避免由于单继承带来的局限。
    (3)增强了程序的健壮性,代码能够被多个线程共享,代码和数据独立。
      

  8.   

    如果说的是Thread和Runnable的话,我更喜欢Runnable:public class DownloadTask implements Runnable{
    private ThreadPool threadPool;

    public void start(){
    if(null != threadPool){
    threadPool.execute(this);
    }else{
    new Thread(this).start();
    }
    } public void run(){
    //....
    }

    public void setThreadPool(ThreadPool threadPool){
    this.threadPool = threadPool;
    }
    }
      

  9.   

    1. 继承Thread--- java只支持单继承,如果继承线程类的话就不能再继承了2. 实现Runnable--- 实现接口可以带来更大的灵活性,改天如果觉得需要另一个类中的方法,那么再继承那个类就行,不影响原来的代码。方法1就不行。2者在功能上是没有区别的
      

  10.   

    java没有多继承,使用实现Runnable接口方式,可以达到Extends其他类的同时,implements Runnable接口的效果。
    个人理解,呵呵,其实我也是来看头像的
      

  11.   

    实现Runnable接口可以解决资源共享的问题。
      

  12.   

    如果一个类继承了Thread 那么这个类当然不能被多继承 但是Runnable就不一样了 可以实现过个接口,用Runnable解决了单继承的问题,然而Runnable 其实不是线程,只是这个接口中实现了run()方法,当你调用线程的时候 还是要声明Thread对象,启动线程,只是Runnable接口的好处就是不被单继承,资源共享的好处,可以代码重用。
      

  13.   

    都是通过Thread类的run()方法实现的,只不过一个是通过覆盖这个方法,一个是利用自身默认的调用Runable接口对象的run()方法
      

  14.   

    多继承单继承的区别嘛,虽说java没有多继承,但加上接口就相当于多继承了
      

  15.   

    通过实现Runnable接口之后,但是还是需要Thread包装才能启动线程。
      

  16.   

    一个命令模式的应用而已  你这么说 其实继承Thread  也是实现了 Runnable 接口
      

  17.   

    首先接口可以避免单继承带来的局限 还有重要的一点是实现Runnable接口可以达到资源共享的目的 比如说四个售票窗口同时卖1000张票 只能有Runnable接口来达到效果 即只有一个对象
      

  18.   

    就是问继承Thread和实现Runnable接口的区别,可能是小弟我表达不是很到位,欢迎大牛指点一二,纯是请教,呵呵
      

  19.   

    没有区别,
    写法不一样而已!
    实质都是 
    Thread.start();
      

  20.   

    看到一篇文章,也是讨论这个问题的http://software.intel.com/zh-cn/blogs/2011/11/16/java-12/?cid=sw:prccsdn2063
      

  21.   

    Java只支持单继承,一个类只能继承一个父类,但是一个类可以实现多个借口,
    借口实现多线程就是弥补JAVA不能实现多继承的不足!!!
      

  22.   

    我面试时候也问题了,还问我用什么方法启动线程?我说用start方法,他反问我为什么重写的是run方法,启动用start,那时候我蒙了,求解答
      

  23.   

     说白了run 就是一个对象  而 start是调这个对象的方法  你觉得呢?
      

  24.   

    我觉得不是呢,重写的run因为是接口的限制,同时run是个回调函数,start是个“通知”的消息,回调的好处是给了线程的时间准备,就是当XX完成的时候,doXX,当线程对象准备完毕的时候调用run,start仅仅是告诉线程对象的一个通知,个人理解。
      

  25.   

    Java 中不能实现什么多线程。只能给线程创建执行的任务。
      

  26.   

    Thread类包装方法多,但不灵活,runnable接口,灵活,通常这个二个都是结合起来使用的,
      

  27.   

    一个是extends Thread类,JAVA只能支持单继承,就是说,一个类只能继承自一个父类,但是,如果使用implements实现Runnable接口,就相当于实现了多重继承,更加的灵活。实际开发中,只要能用第二种,就尽量不用第一种。
    然后,还有一个小问题就是,实现Runnable接口,他里面只有一个Run()方法,你必须new Thread(实现接口的类的实例化对象).start();这样才能调用run()方法。接口中没有start()方法。
    应该就这些了。我能想到的。呵呵。
      

  28.   

    多线程是Java内部的一种机制(不是你创建的),但它执行的任务是你创建的。目前它的任务基本有两种方式创建:
    1、实现Runnable
    2、继承Thread
      

  29.   

    个人感觉,线程启动需要调用系统资源,而run方法是纯调用业务逻辑,从源码也可以看出,start方法调用jni的start0方法,去准备好系统资源,再执行run方法