当前位置: 首页 > 面试题库 >

哪个方法调用run()?

傅阳炎
2023-03-14
问题内容
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

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

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

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

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


问题答案:

在以下文档中start正确声明:

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

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

注意start0run直接呼叫。而是(在高级视图中,忽略JVM内部管理),它指示操作系统创建一个新线程并让该线程执行run

为了澄清起见,以下是有关方法的简短说明:

  • start是启动new的高级功能Thread

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

  • run是您的Runnable类中定义的方法。此方法将在新线程中执行。一个Thread在Java本身对象有没有关于用户代码应该执行的想法。这是关联Runnable对象的责任。

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

当然,您总是可以显式调用run方法Runnable

HelloRunnable hr = new HelloRunnable();
hr.run();

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



 类似资料:
  • 我在超类中有一个重载方法的基本继承情况。 下面的类扩展了上面的类: main方法只是创建一个对象(静态和动态类型)并调用: 最后打印出来 看了这个,我想既然对象的静态和动态类型都是,它会调用Person中的重载方法,该方法将作为参数。由于我显然错了,我打开了一个调试器,假设类中的getWorkDetail(this)行中对“this”的引用一定已经变成了它的超级类。然而,这不是我发现的。 显然,在

  • 本文向大家介绍常用的调用WebService的方法有哪些?相关面试题,主要包含被问及常用的调用WebService的方法有哪些?时的应答技巧和注意事项,需要的朋友参考一下 答: 1.使用WSDL.exe命令行工具。 2.使用VS.NET中的Add Web Reference菜单选项  

  • 问题内容: 是否有一种方法可以使每次调用方法时都会被调用的“超级方法”,即使对于未定义的方法也是如此?有点像这样: 编辑- 细节:我有一个库,该库进行了很多更新,并且每次更新都变得晦涩难懂。为了简化我的工作流程,我正在使程序自动更新库(需要执行我想做的事情,我不会具体说明原因,但是我的程序可以与将来的更新一起使用)并且我有混淆映射与库一起下载时,我想制作一种例如称为的代理,然后在我调用它时,将获得

  • 我正在寻找答案,但无法找到以下答案。 默认情况下,我已经加载了片段A。 现在,我添加新的片段(B)与和片段B是可见的 用户向后按,FragmentManager将弹出片段B,片段A再次可见 所以我的问题是,当片段B被分离时,片段A中的哪个方法将被调用,我正在调试片段A中的所有onResume、onAttach,但看起来它没有被调用。 有一点,如果我们使用替换片段而不是添加片段,它将用片段生命周期运

  • 我有一个层,称为,另一个称为。我想知道我是否可以强制执行一条规则,上面写着: 在参数列表包含名为foo的参数的服务层中的任何公共类的任何公共方法中,断言它从权限层调用方法(理想情况下,确保在服务层中的任何其他方法之前调用该方法)。 ArchUnit可以这样做吗?

  • 但是不知何故,method3()并没有被嘲笑,我仍然看到它打印的内容。但是,我可以成功地模拟method2()。也许是因为method2()是从method1()直接调用的,我正在测试的方法是什么?请建议我如何模拟方法3。 谢谢,梅赫