输出为: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();
}
}
答案 0 :(得分:3)
当您在super.run()
中致电B#run
时,它将执行Thread#run
,并且您传递给构造函数的run
实例的下一个Runnable
方法将是执行。
答案 1 :(得分:2)
因为你有子类B
并且重写了它的方法run()
。
首先调用B
的方法。
并在B
的{{1}}中找到超级电话,因此它会调用run()
的{{1}}(将执行提供的super
先run()
)然后执行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”。