JVM如何知道在执行start()方法时要调用哪个run方法

时间:2013-08-16 13:58:05

标签: java

在下面给出的代码中,我已经在Temp构造函数调用中传递了Thread类对象的引用id,这将被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();
    }
}

5 个答案:

答案 0 :(得分: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 分配给内部私有成员。稍后,在创建对象后,将在对象上调用start(),该对象将查找私有runnable成员,并将其称为run()方法。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您传递了Temp Thread Runnable Thread.start对象。 run会调用Runnable的{​​{1}}方法,因此Temp.run会被调用。

答案 3 :(得分:0)

Thread的{​​{1}}方法调用您传递的对象的start方法作为构造函数的参数。由于您传递了类run的对象,因此将调用Temp的run方法。

答案 4 :(得分: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()尚未被覆盖。