哪个方法调用run()?

Avi*_*tta 0 java multithreading runnable

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();
} } 
Run Code Online (Sandbox Code Playgroud)

根据Java Doc

Runnable接口定义了一个方法,run,意在包含在线程执行的代码.Runnable对象被传递给Thread构造函数.

那么,当我们执行HelloRunnable时,谁调用了内部运行方法?Thread类中,start方法如下所示:

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

从这段代码中,我们可以看到start方法没有调用该run()方法.

Mar*_*olt 11

它在以下文件中说明start:

Java虚拟机调用run此线程的方法

因此,start0JVM中的本机代码负责调用run新创建的线程.(这并不是很意外,因为启动一个线程非常特定于操作系统,无法在纯Java中实现.)

注意:start0run直接打电话.相反(在高级视图中,忽略JVM内部管理),它指示操作系统创建新线程并让该线程执行run.

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

  • start是开始新的高级功能Thread.

  • start0是本机方法,它从操作系统创建一个新线程,并负责确保run调用它.

  • run是您的Runnable类中定义的方法.此方法将在新线程中执行.ThreadJava中的对象本身不知道它应该执行的用户代码.这是相关Runnable对象的责任.

因此,当您调用时Thread.start(),将自动调用该run方法Runnable.

当然,你总是可以明确地调用一个run方法Runnable:

HelloRunnable hr = new HelloRunnable();
hr.run();
Run Code Online (Sandbox Code Playgroud)

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