请问大家这2个START的调用怎么不一样?

lilifb 2007-04-21 11:18:32
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");

}
}
...全文
240 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
noOnlyCode 2007-04-22
  • 打赏
  • 举报
回复
向ls的学习、看齐、接分!
noOnlyCode 2007-04-22
  • 打赏
  • 举报
回复
good good study
day day 想 up
brooksychen 2007-04-22
  • 打赏
  • 举报
回复
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类型的。
frilly 2007-04-22
  • 打赏
  • 举报
回复
一个是extends 一个是implements 当然不一样了

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

第二个是实现了Runnable接口的类,
mx对象为一个线程类的实例提供run()方法,
这个线程类的实例会自动执行mx重写的run()方法。不强加类层次,增加灵活性。
lilifb 2007-04-22
  • 打赏
  • 举报
回复
揭贴了 brooksychen(初晨之阳)回答的最好
malligator 2007-04-22
  • 打赏
  • 举报
回复
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");

}
}
malligator 2007-04-22
  • 打赏
  • 举报
回复
有啥不一样呀?
后面调用的start方法不是你写的那个,而是类Thread中实现的方法(它会调用线程的rum方法)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧