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中实现.)
注意:start0不run直接打电话.相反(在高级视图中,忽略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)
但是,这当然不会在单独的线程中执行,而是阻止执行.
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |