1

以下のコードでは、型参照変数のスレッド クラスのコンストラクターによってキャッチされるコンストラクター呼び出しTemp内で、クラス オブジェクトの参照 IDを渡しています。そのクラス コンストラクター内に、スレッドの作成時にこの特定のクラスのメソッドが実行されることをJVM に伝えるコードがあるかどうかを尋ねたいと思います。ThreadRunnableThreadrun()

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

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

5 に答える 5

1

メソッド内thread.start()で、スレッドは を呼び出しますrunnable.run()

これがどのように機能するかの簡単な方法ですが、実際には、この例では新しいスレッドを作成しないため、この方法では実行されません。

public class Thread {

   private Runnable runnable;

   public Thread(Runnable runnable) {
     this.runnable = runnable;
   }

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

}

次に、電話すると:

new Thread(this).start();

新しいスレッドが作成され、Runnable this が内部のプライベート メンバーに割り当てられます。後で、オブジェクトが作成された後、オブジェクトstart()で呼び出され、プライベートrunnableメンバーが検索され、そのrun()メソッドが呼び出されます。

于 2013-08-16T14:06:23.130 に答える
0

(一般的に)起こることはこれです。

  • メソッドはThread.start()スタックを割り当てます。
  • 次に、メソッドを呼び出しますThread.run()
  • をオーバーライドした場合Thread.run()は、オーバーライドrun()メソッドが呼び出されます。
    • これは...基本的にあなたがそうするように言ったことをします。
  • それ以外の場合は、それ自体で run()実装されたメソッドが呼び出されます。Thread
    • このメソッドは、インスタンスにインスタンスがあるThread.run()かどうかを確認します。ThreadRunnable
    • 存在する場合は、 でメソッドをThread.run()呼び出します。run()Runnable()
    • それ以外の場合、Thread.run()メソッドは単純に戻ります。
  • その後、Thread.run()メソッドは復帰 (または異常終了) し、メソッドはをもはや生きていないとstart()マークし、スタックを解放して Thread オブジェクトに関連付けられた他のものを解体します。Thread

スレッドの作成時にこの特定のクラスの run() メソッドが実行されることを JVM に伝える Thread クラス コンストラクター内のコードはありますか。

ではない正確に。コンストラクターRunnableはプライベート変数に格納し、Thread.run()メソッドはプライベート変数をテストします...Thread.run()オーバーライドされていない場合。

于 2013-08-16T14:04:44.807 に答える
0

start() は、メソッド run() で指定したスレッドの使用を開始するコマンドです。start() が呼び出されるたびに、run() メソッドでコードが実行されます。

于 2013-08-16T14:02:16.207 に答える
0

Tempオブジェクトを として渡しましたThread。はその のメソッドを呼び出すので、が呼び出されます。RunnableThread.startrunRunnableTemp.run

于 2013-08-16T14:02:23.420 に答える
0

Threadのメソッドは、コンストラクタに引数として渡したオブジェクトのメソッドをstart呼び出します。runclass のオブジェクトを渡すのでTempTempの run メソッドが呼び出されます。

于 2013-08-16T14:02:27.487 に答える