1

在下面给出的代码中,我Temp在构造函数调用中传递了类对象的引用 ID,Thread这将被线程类的构造函数在Runnable类型引用变量中捕获。所以我想问一下,在Thread该类构造函数中是否有任何代码告诉JVM,这个特定类的run()方法将在创建线程时执行。

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

start() 是开始使用您在方法 run() 中指定的线程的命令。每当调用 start() 时,它将执行 run() 方法中的代码。

于 2013-08-16T14:02:16.207 回答
0

你传入一个Temp对象作为Thread's RunnableThread.start会调用它的run方法Runnable,所以Temp.run会被调用。

于 2013-08-16T14:02:23.420 回答
0

Threadstart方法调用run您作为参数传递给构造函数的对象的方法。由于您传递了 class 的对象,Temp因此Temp将调用 的 run 方法。

于 2013-08-16T14:02:27.487 回答
0

发生的事情(通常)是这样的。

  • Thread.start()方法分配堆栈,依此类推。
  • 然后它调用该Thread.run()方法。
  • 如果您已覆盖Thread.run(),则调用您的覆盖run()方法。
    • 这确实......基本上你告诉它做什么。
  • 否则调用自己 run()实现的方法。Thread
    • Thread.run()方法检查Thread实例是否有Runnable实例。
    • 如果是,则Thread.run()调用run().Runnable()
    • 否则,该Thread.run()方法简单地返回。
  • 然后该Thread.run()方法返回(或异常终止),该start()方法将其标记Thread为不再活动,并释放堆栈并拆除与 Thread 对象关联的其他东西。

该 Thread 类构造函数中是否有任何代码告诉 JVM 这个特定类的 run() 方法将在创建线程时执行。

不完全是。构造函数将 存储Runnable在私有变量中,并且该Thread.run()方法测试私有变量...如果Thread.run()没有被覆盖。

于 2013-08-16T14:04:44.807 回答