日期:2014-05-20  浏览次数:20668 次

请问大家这2个START的调用怎么不一样?
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 ");

}
}

------解决方案--------------------
一个是extends 一个是implements 当然不一样了

第一个是继承的线程类,mc 就是一个线程的子类,当然可以直接调用父类的start()方法,来执行自己重写的run()方法。

第二个是实现了Runnable接口的类,
mx对象为一个线程类的实例提供run()方法,
这个线程类的实例会自动执行mx重写的run()方法。不强加类层次,增加灵活性。

------解决方案--------------------
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类型的。
------解决方案--------------------
有啥不一样呀?
后面调用的start方法不是你写的那个,而是类Thread中实现的方法(它会调用线程的rum方法)
------解决方案--------------------
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 ");

}
}