在Thread类中运行方法

时间:2012-01-16 08:16:47

标签: java java-threads

输出为: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();
    }
}

5 个答案:

答案 0 :(得分:3)

当您在super.run()中致电B#run时,它将执行Thread#run,并且您传递给构造函数的run实例的下一个Runnable方法将是执行。

答案 1 :(得分:2)

因为你有子类B并且重写了它的方法run()

首先调用B的方法。

并在B的{​​{1}}中找到超级电话,因此它会调用run()的{​​{1}}(将执行提供的superrun())然后执行Runnable的{​​{1}}

答案 2 :(得分:2)

Thread.run只需调用您提供的run实施的Runnable方法即可。但是你永远不应该拨打Thread.run,而是拨打Thread.start

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

当你创建了B类的对象并传递给它时,类b的构造函数被调用.B的构造函数中是什么? 超级(R); 这将r设置为超级呼叫。 现在在main中,当你说t.run()它调用类B的重写方法时,通过说super(r)来调用你已经绑定的对象的run方法。所以a的run方法首先被调用,然后打印“ThreadB”。