2012-01-16 27 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」。