一个类(假如叫ThreadAndRunnable)extends Thread与implements Runnable,我有几点看法:
1、如果extends Thread后就不能extends其他类了
2、如果implements Runnable,那还是要将一个ThreadAndRunnable对象传到Thread的构造方法中,new出一个线程对象,
   并调用start()方法才能启动那个ThreadAndRunnable实例对应的线程(能这样叫不?)
3、有人说implements Runnable能让多个线程共享一个ThreadAndRunnable实例,但我认为extends Thread时把相应的field声明为static也可以实现一样的功能,比如下面两段代码的功能是一样的:class ThreadAndRunnable implements Runnable {
private int x = 0;
public void run() {
System.out.println(++x);
}
}public class Test {
public static void main(String[] args){
ThreadAndRunnable r = new ThreadAndRunnable();
for (int i = 0; i < 10; i++) {
Thread t = new Thread(r);
t.start();
}
}
}
与class ThreadAndRunnable extends Thread {
private static int x = 0;
public void run() {
System.out.println(++x);
}
}public class Test {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Thread t = new ThreadAndRunnable();
t.start();
}
}
}总之,我觉得除了上面1、2两点外,这两种方式没有区别了,希望大家帮忙,让我走出误区~

解决方案 »

  1.   

    那你要实现下面的功能,是不是又要想另想办法呢?我觉得runable 把要执行的过程的数据和代码封装起来,体现了一种良好的思想,并不在于你通过别的方法能不能达到相同的功能。
    public class Test {
        public static void main(String[] args){
            ThreadAndRunnable r = new ThreadAndRunnable();
            for (int i = 0; i < 10; i++) {
                Thread t = new Thread(r);
                t.start();
            }
            ThreadAndRunnable r2 = new ThreadAndRunnable();
            for (int i = 0; i < 10; i++) {
                Thread t = new Thread(r2);
                t.start();
            }
        }
    }
      

  2.   

    答:楼主的着眼点仅仅是语法等上的区别,学习时更应该注重概念背后隐藏的设计意图.若仅仅从语言或语法本身着眼,容易设计出"怪胎式"的代码.1)一般认为:实现Runnable接口的对象,其着眼点主要含义是:一个计算任务.它代表一个要被其它线程(如:线程池中的线程)执行的任务.着眼点是:交由其它人去完成的一个计算任务.  ---对应着:要做的工作2)一般认为:从Thread类继承的含义主要是:一个能执行其它(或自己)的任务的一个线程对象.着眼点是:线程的功能(通过继承来扩展执行其它计算任务的能力)  ---对应着:做工作的工作人员3)当然:若一个类已有父亲,不能再从Thread类继承,只好实现Runnable接口来达到线程的目的,这是一种选择了.以上仅是从设计代码的一种意图上说明,仅供你参考.
      

  3.   

    1、如果extends Thread后就不能extends其他类了 
    还有 用接口 只有一个方法
    extends 不用new了 直接start
    我也就知道这些 呵呵
    看了楼主的帖子又明白了一些不知道的
      

  4.   


    jiangnaisong 很形象的解释。
      

  5.   

    感觉implements Runnable 和 extends Thread 还是有区别的 比如这两种分别调用 Thread.currentThread().getName()方法 结果不一样