请问大家这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 ");
}
}