簡體   English   中英

擴展Thread類時如何調用run()方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM