2012-01-16 68 views
0

输出结果是:RunnableA ThreadB
我不明白它是怎么回事? (在B类的run方法会发生什么)Thread类中的运行方法

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(); 
    } 
} 

回答

1

仔细看清Thread类的run方法的执行情况作为下:

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

所以调用线程的run方法调用了Runnable的传递运行,在你的情况,你已经通过了A创建线程t时的实例。因此,调用super.run()调用Thread类的run方法,该方法依次调用A(可运行或目标)的run方法。

3

您拨打super.run()B#run它将执行的,你传递给将要执行的构造Runnable实例的Thread#run和明年run方法。

1

因为您有子类B并覆盖其方法run()

先调用B的方法。

Brun()它找到超级调用,这样它会调用superrun()(将执行提供Runnablerun()),然后再执行Brun()

2

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

0

当你创建类B的对象并传递给它时,类b的构造函数被调用了.B的构造函数中有什么?超级(r); 这将r设置为超级呼叫。 现在主要当你说t.run()时,它调用类B的重写方法,它调用超级(r).so所绑定的对象的run方法,将a的run方法称为first然后打印“ThreadB”。