2013-12-18 46 views
0

在閱讀java.lang.Thread類的源代碼時。奇怪的是我想看看一個run()方法(用戶定義的run())是如何由Thread類調用的。當我在執行Runnable界面如下當我們擴展Thread類時,如何調用run()方法

Thread waiterThread = new Thread(waiter, "waiterThread"); 
waiterThread.start(); 

在從Thread類的構造方法init()上面的代碼被調用,並從那裏他們本身初始化Runnable實例作爲this.target = target

start()從方法它們被調用native方法start0()而有可能在轉呼叫的Thread類這導致用戶定義run()方法來執行的方法run()

以下是從Thread類的run()方法實現:

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

我的問題是,當我們擴展java.lang.Thread類,當我們如下調用start()方法。

public class HelloThread extends Thread { 

    public void run() { 
    System.out.println("Hello from a thread!"); 
    } 

    public static void main(String args[]) { 
     (new HelloThread()).start(); 
    } 

} 

在上述情況下target = null所以它是本機方法的(start0())責任來設定目標= HelloThread的實例?在擴展Thread類的情況下,如何調用run()方法?

回答

1

怎麼我的run()方法被調用的情況下,當我向Thread類

因爲你擴展的類。你重寫run()方法來做一些不同的事情。 @Override註解用於突出顯示此方法覆蓋父方法。

target不會奇蹟般地被改變,你在你的代碼中被忽略了。

1
new HelloThread() 

本身將調用init()方法,它將設置您的目標。如果您擴展Thread類,它將被設置爲null。所以目標將是空的。

如果你看到docs的run()方法上面清清楚楚地寫着

如果該線程是使用獨立的Runnable運行對象,則該Runnable對象的run方法被調用構造;否則,這個方法什麼都不做,並返回。Thread的子類應該覆蓋這個方法。

0

在start()方法中,底層運行時對象run()方法將在start()方法內被調用。這裏的底層運行時對象是HelloThread類對象。這就是爲什麼調用HelloThread的run()方法。

相關問題