线程之谜

zrcvic 2009-09-19 10:02:10
创建一个线程有两种方法,
第一种是 class T extends Thread { ... },在 T 类中覆写 Thread 类的 run 方法,然后用 T t = new T(); t.start() 来启动这个线程;
第二种是 class R implements Runnable { ... },然后 Thread t = new Thread(new R()) 来启动一个线程。

那么问题来了,如果我们这样写:
class T extends Thread {

public void run() {
System.out.println("T.run");
}

public T(Runnable r) {
super(r);
}
}

class R implements Runnable {
public void run() {
System.out.println("R.run");
}
}

然后我们用这样的变态用法: T t = new T(new R()); t.start() 来启动一个线程,那么这个线程会执行哪个 run 方法呢?是 T.run,还是 R.run,还是两个方法都执行?

附:我在自己的电脑上执行了这段程序,结果是输出了 T.run。我并不是想只知道一个结果,我想知道的是,为什么会产生这个结果?哪个 Java 文献上对此作出了解释?
...全文
118 2 打赏 收藏 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zrcvic 2009-09-19
  • 打赏
  • 举报
回复
明白了。用 new Thread(new R()) 构造出来的线程在 start 时会调用 Thread 类的 run 方法,而这个 run 方法会调用 Runnbale 对象的 run 方法。所以 Runnbale 对象 run 方法的调用是间接的。

而 new T() 构造出来的 T 类对象具有直接覆写过的 run 方法,所以 Thread 类的 run 方法不会被调用,所以 Runnable 对象的 run 方法就更不会被间接调用了。

如果用 super.run() ,就会调用 Thread 类的 run 方法,然后这个方法又会调用 R 类的 run 方法,所以就会打印出 R.run 来。

原来这个问题很简单,只不过我没有弄清原理而已。感谢 rumlee。
rumlee 2009-09-19
  • 打赏
  • 举报
回复
只会打印T.run,因为你重写了Thread类的run方法,如果你把T的run方法去掉,则会打印R.run。

你如果改成
class T extends Thread {

public void run() {
System.out.println("T.run");
super.run();
}

public T(Runnable r) {
super(r);
}
}

class R implements Runnable {
public void run() {
System.out.println("R.run");
}
}

则会两个都执行。

62,620

社区成员

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

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