class mc extends Thread
{
public static void main(String argv[])
{
     mc t=new mc();
     t.start();
}
public void run(){
System.out.println("run() run");
}
public void start(){
System.out.println("start() run");

}}
*******************************************************
class mx implements Runnable{
public static void main(String[] args){
Thread t=new Thread(new mx());
t.start();
}
public void run(){
System.out.println("run() run");
}
public void start(){
System.out.println("start() run");

}
}

解决方案 »

  1.   

    一个是extends 一个是implements 当然不一样了第一个是继承的线程类,mc 就是一个线程的子类,当然可以直接调用父类的start()方法,来执行自己重写的run()方法。第二个是实现了Runnable接口的类,
     mx对象为一个线程类的实例提供run()方法,
     这个线程类的实例会自动执行mx重写的run()方法。不强加类层次,增加灵活性。
      

  2.   

    lz定义的mc继承了Thread,而且override了start方法,所以t.start();调用的不是父类而是自己本身的start()方法。严格的说,这样的操作没有启动线程,只是调用类的一个方法而已。要想启动线程,或者不添加override的这个start()方法(即mc类中不再定义start()方法),或者在mc的start()方法体中,第一句写super.start();而使用implements实现Runnable接口的时候,由于该接口只有一个run()方法需要实现,所以定义的start()方法是mx而不是属于Runnable。启动线程的时候所调用的start()方法启动的实际上是Thread的start()方法,因为Thread t=new Thread(new mx());说明t是Thread类型的。
      

  3.   

    good good study
    day day 想 up
      

  4.   

    有啥不一样呀?
    后面调用的start方法不是你写的那个,而是类Thread中实现的方法(它会调用线程的rum方法)
      

  5.   

    class mx implements Runnable{
    public static void main(String[] args){
    Thread t=new Thread(new mx());
    t.start();
    **************(这两个调用的方法是不一样滴)*********
    mx t=new mx();
    t.start();}
    public void run(){
    System.out.println("run() run");
    }
    public void start(){
    System.out.println("start() run");}
    }
      

  6.   

    揭贴了  brooksychen(初晨之阳)回答的最好