线程的两种实现方式为什么不同?

8slob 2003-12-15 11:43:06
class A implements Runnable{
public void run(){}
}
class B extends Thread{
public void run(){}
}
在使用类A和B时,为什么方法不一样呢?如A为: A a=new A(); Thread thread=new Thread(a); thread.start();
而B为:B b=new B(); b.start();
为什么会出现这两种方式的实现方式呢,为什么类A不能直接象类B那样实例化运行呢?
...全文
629 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
goldenhua 2003-12-16
  • 打赏
  • 举报
回复
有些问题追根到底就是那么简单明白,任何浮于表面的形式化争论都是没有必要的;
goldenhua 2003-12-16
  • 打赏
  • 举报
回复
是这样的:

多线程机制是Thread类提供的,只有Thread类及其之类可以start一个新的线程(使用start()方法,这个方法是native方法,它提供java的多线程机制);run方法只是一个普通的方法,你不能显示的调用它,显示调用它跟调用一个普通的方法没有任何区别;run方法是由start方法调用的,start()调用run的方式如下(实际上在jvm内部还有很多事情要做):
run();

而Thread类的run方法实现如下:
public void run() {
if (target != null) {
target.run();
}
}
其中target是Thread类对象的一个属性,任何实现了Runnable接口的类都可以是一个target,Thread类也实现了Runnable接口;你给出的两种情况中:
B b=new B();
如果你为B类重定义了run方法,那么b.start()就是运行B类的run方法;如果没有,就是运行从Thread类继承来的run(),此时target为null,什么都不做;


A a=new A(); Thread thread=new Thread(a); thread.start();
thread的target被初始化为a,thread.start()启动的线程运行的是a.run()

明白了吗?如果还不明白,那么看看Thread类的源代码吧。
alphafish 2003-12-16
  • 打赏
  • 举报
回复
这两种方式都是有用途的。java语言的继承有一个特点是单向继承,就是说一个类不能同时继承两个或者两个以上的类。一个类,如果没有继承其他类,要实现线程那么可以用B方法;如果一个类已经继承了其他类那么就不可能使用B方法来实现线程了,只能用A方法来实现了。其实java中接口的其中一个用途就是可以实现多向继承。
xiaohaiz 2003-12-16
  • 打赏
  • 举报
回复
求知欲望还是可以鼓励的嘛,不过好像基础还是有很大差距啊。
B可以这样运行:
<<
new Thread(new B(){public void run(){/*ImplementationHere*/}}).start();
>>
tiger_wkh52741 2003-12-16
  • 打赏
  • 举报
回复
A 实现
B 继承
两者的方法当然不一样了!
看书! THINKING IN JAVA 6.7章!
drinkant 2003-12-16
  • 打赏
  • 举报
回复
果然是扯淡

A继承自Object,同时实现Runnable
至于楼主问为什么两者不能一样,我靠,这个问题问的好,但是不应该问我们,而是问sun
呵呵,这年头,是个疑问就提,连大脑也不经过
xiachedan 2003-12-16
  • 打赏
  • 举报
回复
A是实现一个接口,当然不能被事例华了,B是继承了Thread,是一个class,当然可以实例化!!!
8slob 2003-12-16
  • 打赏
  • 举报
回复
谢谢 goldenhua(深深地爱上了你)

62,614

社区成员

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

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