Java 哪个方法调用run()?

Java 哪个方法调用run()?,java,multithreading,runnable,Java,Multithreading,Runnable,据 Runnable接口定义了一个方法run,用于包含线程中执行的代码。可运行对象被传递给线程构造函数 那么,当我们执行HelloRunnable时,谁调用内部运行方法? 在Thread类中,start方法如下所示: public class HelloRunnable implements Runnable { public void run() { System.out.println("Hello from a thread!"); } public static void m

Runnable接口定义了一个方法run,用于包含线程中执行的代码。可运行对象被传递给线程构造函数

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

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();
} } 
从这段代码中,我们可以看到start方法没有调用run方法。

它在下面的

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

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

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

为了澄清,以下是所涉及方法的简要说明:

start是启动新线程的高级函数

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

run是在可运行类中定义的方法。此方法将在新线程中执行。Java中的线程对象本身不知道应该执行什么用户代码。这是关联的可运行对象的责任

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

当然,您始终可以显式调用Runnable的run方法:

public synchronized void start() {
     if (threadStatus != 0)
         throw new IllegalThreadStateException();
     group.add(this);
     start0();
     if (stopBeforeStart) {
         stop0(throwableFromStop);
     }
 }
但是,这当然不会在单独的线程中执行,而是阻止执行。

它在下面的

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

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

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

为了澄清,以下是所涉及方法的简要说明:

start是启动新线程的高级函数

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

run是在可运行类中定义的方法。此方法将在新线程中执行。Java中的线程对象本身不知道应该执行什么用户代码。这是关联的可运行对象的责任

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

当然,您始终可以显式调用Runnable的run方法:

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

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

关于start0方法,它会调用run方法吗?我是说,没有魔法,对吧?如果调用run,一定有人在调用它:-threadstatus是什么?停止前进?@dasblinkenlight start0看起来像这样。。内联`private native void More…开始0`@dasblinkenlight,线程的run方法不会从start调用中的任何位置调用。如果线程A调用t.start,您不会希望线程A调用t.run,是吗?您可能希望它被另一个线程调用。但是,t.start调用发生在线程A中,而t.start直接或间接调用的所有内容都发生在线程A中。t.run方法从其他地方被调用。@dasblinkenlight,P.S.,如果magic意味着编写纯Java代码无法完成的事情,那么是的。有魔力。对于纯Java程序员来说,系统调用是神奇的。start0方法呢,它调用run方法吗?我是说,没有魔法,对吧?如果调用run,一定有人在调用它:-threadstatus是什么?停止前进?@dasblinkenlight start0看起来像这样。。内联`private native void More…开始0`@dasblinkenlight,线程的run方法不会从start调用中的任何位置调用。如果线程A调用t.start,您不会希望线程A调用t.run,是吗?您可能希望它被另一个线程调用。但是,t.start调用发生在线程A中,而t.start直接或间接调用的所有内容都发生在线程A中。t.run方法从其他地方被调用。@dasblinkenlight,P.S.,如果magic意味着编写纯Java代码无法完成的事情,那么是的。有魔力。对于一个纯Java程序员来说,系统调用是神奇的。那么JVM什么时候出现,比如JVM是如何得到start已被调用的通知,现在是调用run方法的时候了@
好的,谢谢。好奇的是,从本机代码调用run纯java代码有可能吗?我注意到您谨慎地说start0负责调用run,但您可以更明确地说它不调用run。事实上,run不是从start调用中的任何位置调用的。它在不同的线程中调用。这是一个很多noob都很难理解的概念。那么JVM什么时候出现,比如JVM是如何被通知start已经被调用的,现在是时候调用run方法了@好的,谢谢。好奇的是,从本机代码调用run纯java代码有可能吗?我注意到您谨慎地说start0负责调用run,但您可以更明确地说它不调用run。事实上,run不是从start调用中的任何位置调用的。它在不同的线程中调用。这是一个很多noob都难以理解的概念。