在调用 Thread.run() 之前,JVM 在后台做什么?或者为什么 Thread.run() 不向用户公开?



当程序员调用Thread.start()时,JVM调用了线程的运行方法。

  1. 在调用Thread.run()之前,JVM在后台做什么?

  2. 为什么Thread.run()不暴露于用户?

在调用Thread.run()之前,JVM在背景中做什么?

它可以执行JVM来管理线程对象(分配堆栈空间,线程 - 局部...),以及分叉和安排新线程/过程/克隆或架构使用的任何内容的每架结构本机工作实施线程。

为什么Thread.run()不暴露于用户?

我假设您在堆栈框架上谈论"暴露"。就像静态main方法一样,显然在用户代码上方没有接触用户的呼叫框架,因为它们没有用,而且会令人困惑。我对Thread.run()方法说同样的话。如果您扩展了Thread和覆盖run(),它将显示在呼叫堆栈中,但如果您通过目标Runnable

,则不会不会

我在此答案中有很多细节:

Java Run()方法如何工作?

在调用thread.run()?

之前,JVM在背景中做什么?

呼叫start()时,它启动了与Thread对象关联的线程,该线程调用线程的运行()方法。

注意:创建,启动和调度线程的所有工作均由OS完成。Java只是进行正确的系统调用。实际工作不是JVM代码。

或为什么thread.run()不暴露于用户?

它暴露了。它是公开的,您可以像其他任何方法一样称呼它。

通过thread.run()进行启动时,您正在作为正常过程运行,而不是真正使用它作为线程。它将与主线程一起连接。使用thread.start(),JVM分配了不会与主线程连接的单独线程。

调用start()时,Thread类实际创建了新的JVM线程(与调用线程分开),并从该新线程调用run()

创建新的JVM线程,因此应用程序代码可以具有多个运行代码的线程,是一个低级JVM操作。

如果run()暴露于用户,并且将其称为start(),则run()中的代码将在单个调用线程中串行执行。

someThread.start()调用一种本机方法,该方法告诉JVM创建一个新线程。例如,热点的血腥详细信息可以在源代码中找到。

在物质中,start()要求OS创建一个新线程,然后在该新创建的线程中调用Thread#run()方法。

您开始深入研究JVM本身的实现,因为新线程的启动需要与操作系统进行交互。这是JVM中线程的很好的中层解释。

最新更新