线程的两种实现方式为什么不同? A是实现一个接口,当然不能被事例华了,B是继承了Thread,是一个class,当然可以实例化!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 果然是扯淡A继承自Object,同时实现Runnable至于楼主问为什么两者不能一样,我靠,这个问题问的好,但是不应该问我们,而是问sun呵呵,这年头,是个疑问就提,连大脑也不经过 A 实现 B 继承两者的方法当然不一样了!看书! THINKING IN JAVA 6.7章! 求知欲望还是可以鼓励的嘛,不过好像基础还是有很大差距啊。B可以这样运行:<<new Thread(new B(){public void run(){/*ImplementationHere*/}}).start();>> 这两种方式都是有用途的。java语言的继承有一个特点是单向继承,就是说一个类不能同时继承两个或者两个以上的类。一个类,如果没有继承其他类,要实现线程那么可以用B方法;如果一个类已经继承了其他类那么就不可能使用B方法来实现线程了,只能用A方法来实现了。其实java中接口的其中一个用途就是可以实现多向继承。 是这样的:多线程机制是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类的源代码吧。 谢谢 goldenhua(深深地爱上了你) 这段代码如何简化一下?灵活一点写 JAVA日期时间组合 高分求JDBC ORACLE 资料(先给100收到后再给100) [求助]帮忙测试测试这个小程序有问题吗? 一个小问题,请大家帮忙解决 请教流操作:InputStreamReader ASCII为0的是什么字符? JavaScipt问题 如何使table不能编辑?不是 table.setEnable(false); 请大神推荐java设计模式视频教程 一个极其痛苦的数组问题,哪为高手能帮小弟解决!急!!! 关于JFileChooser只选择文件夹的问题(必结贴)
至于楼主问为什么两者不能一样,我靠,这个问题问的好,但是不应该问我们,而是问sun
呵呵,这年头,是个疑问就提,连大脑也不经过
B 继承
两者的方法当然不一样了!
看书! THINKING IN JAVA 6.7章!
B可以这样运行:
<<
new Thread(new B(){public void run(){/*ImplementationHere*/}}).start();
>>
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类的源代码吧。