类A实现了Runnable 接口,而且拥有和Thread相同的方法,比如join,sleep,Thread threadA = new Thread(A);那么threadA的join,sleep方法倒底是Thread类的还是A的?
为什么有这样的疑问呢?这涉及到接口,类,以及构造函数的问题了,就是说一个接口IA,有两个实现类CA和CB. CB有一个构造函数是利用IA来创建,而CA可以做为参数传入。那最终创建的CB与CA存在方法冲突怎么办呢?CB还是保留自己方法,还是使用CA的方法呢?
为什么有这样的疑问呢?这涉及到接口,类,以及构造函数的问题了,就是说一个接口IA,有两个实现类CA和CB. CB有一个构造函数是利用IA来创建,而CA可以做为参数传入。那最终创建的CB与CA存在方法冲突怎么办呢?CB还是保留自己方法,还是使用CA的方法呢?
解决方案 »
- Java 绘图问题
- rmi 超 时 的 问 题。。。。应该是这个问题吧。
- JDK中没有构造方法的类要怎么用?
- java 自定义button响应键盘事件
- 如何从一串混合运算中提取字符串?
- 根据txt文件生成树的问题,不是xml格式的,麻烦大家看一下
- 散分了
- 初学!最基础的!
- com.sun.enterprise.naming.SerialContext.getProvider??
- 菜鸟请教:我下了一个freeJava,怎么编译程序(程序没问题)没反应,它的JDk目录我也设了d:\jdk.3(JDK1.3不是安装的,是从JBuilder5直接里复制放在d:\jdk1.3里),用别的工具都可以编译成功!
- 如何在XML Doucument返回指定的Element,如果找不到,返回null
- long型日期转换成yyyy-mm-dd hh 有人会吗?
A只不过是作为一个构造函数的参数而已,怎么可能混淆?
Thread threadA = new Thread(A);
那么threadA的join,sleep方法倒底是Thread类的还是A的?我的理解是 threadA是新线程 A是参数 跟你写的构造函数有关,如果你的构造函数不带参数,那这个A就不需要了
threadA的join sleep方法是threadA的 ,从runnable接口继承下来的
2、当然不可能是CA的任何方法,同样它仅仅是CB的一个成员而已,所有CB的方法都绝不可能被CA所覆盖
threadA的join sleep方法是threadA的 ,从runnable接口继承下来的
threadA的join sleep方法是threadA的 ,从runnable接口继承下来的
这句话对吗?
ruunable接口只有一个方法,那就是run,join,sleep这些方法是Thread类的,类A实现了Runnable 接口,而且拥有和Thread相同的方法,比如join,sleep,
Thread threadA = new Thread(A);
那么threadA的join,sleep方法倒底是Thread类的还是A的?
你如何解释?
threadA的join sleep方法是threadA的 ,从runnable接口继承下来的
这句话对吗?
ruunable接口只有一个方法,那就是run,join,sleep这些方法是Thread类的,类A实现了Runnable 接口,而且拥有和Thread相同的方法,比如join,sleep,
Thread threadA = new Thread(A);
那么threadA的join,sleep方法倒底是Thread类的还是A的?
你如何解释?
-------------------调用join,sleep时,当然是调用threadA本身的方法,根本不会是A的方法
如果继承Thread类,则每start一次,是启动了一个新的线程实例,最后是多个线程实例;
如果实现了Runnable接口,则每start一次,是启动了一个线程的一个子应用,最后依然是一个线程实例;因此,我觉得是 传进的参数的 而不是 Thread的
这个和A到底是Runnable或者继承Thread都没有关系,JVM见到的就是threadA。所以你调用threadA的join,sleep方法根本不可能是A的,因为JVM根本见不到AA只是threadA中的一个变量而已,请你看看JDK的源代码!!
Thread的源代码中 public void run() {
if (target != null) {//这个target就是Thread(Runnable)传入的变量
target.run();
}
}所以绝对不是传入的参数,而是Thread类的方法!
例如: public class Test extends Thread{
public Test(){
}
public static void main(String args[]){
Test t1 = new Test();
Test t2 = new Test();
t1.start();
t2.start();
}
public void run(){
//do thread's things
}
}--------------------------------------------------------------------------------
另一种是实现Runnable接口,此接口只有一个函数,run(),此函数必须由实现了此接口的类实现.
例如: public class Test implements Runnable{
Thread thread1;
Thread thread2;
public Test(){
thread1 = new Thread(this,"1");
thread2 = new Thread(this,"2");
}
public static void main(String args[]){
Test t = new Test();
t.startThreads();
}
public void run(){
//do thread's things
}
public void startThreads(){
thread1.start();
thread2.start();
}
}
第一种因为继承自Thread,只创建了自身对象,但是在数量上,需要几个线程,就得创建几个自身对象;
第二种只创建一个自身对象,却创建几个Thread对象.最后不得不仰慕ChDw(米)一把,好一个受不了,让我也反思了一把,呵呵
你说:这个和A到底是Runnable或者继承Thread都没有关系,JVM见到的就是threadA。所以你调用threadA的join,sleep方法根本不可能是A的,因为JVM根本见不到A试问一下:你怎么知道JVM根本就不到A的?
Thread threadA = new Thread(A),
threadA是通过A来创建的,为什么JVM看到A呢?new Thread(Runnable a)这个构造函数倒底发生了什么事情?
public
class Thread implements Runnable {
...
private Runnable target;
...
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
...
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
...
this.target = target;
...
}
...
public void run() {
if (target != null) {
target.run();
}
}
...
}所以说其实是threadA的run()其实最终是调用了A的run();
但是不是覆盖此方法,而是委托调用的。