0

输出是:RunnableA ThreadB
我不明白它是怎么来的??(B类的run方法发生了什么)

class A implements Runnable{
    public void run(){
        System.out.println("RunnableA");
    }
}
class B extends Thread{
    B(Runnable r){
        super(r);
    }
    public void run(){
        super.run();
        System.out.println("ThreadB");
    }
}
class Demo{
    public static void main (String []args){
        A a=new A();
        Thread t=new B(a);
        t.run();
    }
}
4

5 回答 5

3

当您调用它时super.run()B#run它将执行Thread#run并且您传递给构造函数run的实例的下一个方法将被执行。Runnable

于 2012-01-16T08:20:06.133 回答
2

因为你有子类B并覆盖了它的方法run()

它会首先调用B's 方法。

并在B'srun()中找到超级调用,因此它首先调用super's run()(它将执行提供Runnable的 's run())然后执行B'srun()

于 2012-01-16T08:20:37.063 回答
2

Thread.run只需调用您给它run的实现方法。Runnable但你不应该打电话Thread.run,而是打电话Thread.start

于 2012-01-16T08:21:50.610 回答
1

仔细查看 Thread 类的 run 方法的实现,如下所示:

  public void run() {
    if (target != null) {
        target.run();
    }
    }

因此,调用 Thread 的 run 方法会调用传递的 Runnable 的 run ,在您的情况下,您在创建 Thread t 时已经传递了 A 的实例。因此调用 super.run() 调用 Thread 类的 run 方法,该方法又调用 A 的 run 方法(可运行或目标)。

于 2012-01-16T08:34:42.653 回答
0

当您创建 B 类的对象并将 a 传递给它时,会调用 B 类的构造函数。B 的构造函数中有什么?超级(r);这将 r 设置为超级调用。现在在 main 中,当您说 t.run() 时,它调用 B 类的重写方法,该方法通过说 super(r) 调用您已绑定 super 的对象的 run 方法。因此首先调用 a 的 run 方法,然后然后打印“ThreadB”。

于 2014-03-06T17:38:55.253 回答