哪个方法调用run()?

时间:2016-08-29 11:53:10

标签: java multithreading runnable

XmlSlurper

根据Java Doc

  

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(); } } 接口定义了一个方法Runnable,用于包含线程中执行的代码。 Runnable对象被传递给Thread构造函数。

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

start

从这段代码中,我们可以看到start方法没有调用public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); start0(); if (stopBeforeStart) { stop0(throwableFromStop); } } 方法。

1 个答案:

答案 0 :(得分:7)

documentation of start

中说明了这一点
  

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

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

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

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

  • start是启动新Thread的高级功能。

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

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

因此,当您致电Thread.start()时,系统会自动调用run的{​​{1}}方法。

当然,您始终可以明确调用Runnable的{​​{1}}方法:

run

但是,这当然会在单独的线程中执行 not ,但会阻止执行。