[英]How a run() method is called when we extend Thread class
在瀏覽java.lang.Thread
類的源代碼時。 奇怪的是,我想看看Thread類如何調用run()
方法(用戶定義的run())。 當我實現如下的Runnable
接口時
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
,因此設置target = HelloThread的實例是本機方法的( start0()
)責任嗎? 當擴展Thread
類時,如何調用我的run()
方法?
當我擴展Thread類時,如何調用我的run()方法
因為您擴展了課程。 您覆蓋了run()方法以執行其他操作。 @Override批注用於突出顯示此方法將覆蓋父方法。
target
不會發生神奇的變化,您在代碼中將其忽略了。
new HelloThread()
本身將調用init()
方法來設置目標。 如果要擴展Thread類,它將設置為null。 因此target將為null。
如果您看到run()方法的文檔 ,它會清楚地顯示
如果此線程是使用單獨的Runnable運行對象構造的,則將調用該Runnable對象的run方法;否則,將調用該方法。 否則,此方法不執行任何操作並返回。Thread的子類應重寫此方法。
在start()方法中,將在start()方法中調用基礎運行時對象run()方法。 這里的底層運行時對象是HelloThread類對象。 這就是為什么調用HelloThread的run()方法的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.