哪个方法调用 运行()?
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()
时,Runnable
的run
方法将自动被调用。
当然,您始终可以显式调用 Runnable
的 run
方法:
HelloRunnable hr = new HelloRunnable();
hr.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()
时,Runnable
的run
方法将自动被调用。
当然,您始终可以显式调用 Runnable
的 run
方法:
HelloRunnable hr = new HelloRunnable();
hr.run();
但是,这当然不会在单独的线程中执行,而是阻塞执行。