哪个方法调用 运行()?

Which method calls run()?

public class HelloRunnable implements Runnable {

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

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

根据Java Doc

The Runnable interface defines a single method, run, meant to contain the code executed in the thread. The Runnable object is passed to the Thread constructor.

那么,我们执行HelloRunnable的时候,里面的运行方法是谁调用的呢?Thread class 中,start 方法如下所示:

public synchronized void start() {
     if (threadStatus != 0)
         throw new IllegalThreadStateException();
     group.add(this);
     start0();
     if (stopBeforeStart) {
         stop0(throwableFromStop);
     }
 }

从这段代码可以看出,start方法并没有调用run()方法。

documentation of start 中有说明:

the Java Virtual Machine calls the run method of this thread

因此,JVM start0 中的本机代码负责在新创建的线程中调用 run。 (这并不完全出乎意料,因为启动线程是非常 OS 特定的,不能在纯 Java 中实现。)

注意start0不直接调用run。相反(在高级视图中,忽略 JVM 内部管理),它指示操作系统创建一个新线程并让该线程执行 run.

为了澄清,这里是对所涉及方法的简短描述:

  • start 是启动新 Thread.

  • 的高级函数
  • start0 是从操作系统创建新线程的本机方法,负责确保调用 run

  • run是你Runnable类中定义的方法。此方法将在新线程中执行。 Java 中的 Thread 对象本身并不知道它应该执行的用户代码。这是关联的 Runnable 对象的职责。

因此,当您调用Thread.start()时,Runnablerun方法将自动被调用。

当然,您始终可以显式调用 Runnablerun 方法:

HelloRunnable hr = new HelloRunnable();
hr.run();

但是,这当然不会在单独的线程中执行,而是阻塞执行。