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

时间:2012-12-19 18:43:25

标签: java multithreading jvm

当程序员调用Thread.start()时,JVM会调用线程的run方法。

  1. 在致电Thread.run()之前,JVM在后台做了什么?

  2. 为什么Thread.run()没有向用户公开?

6 个答案:

答案 0 :(得分:6)

  

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

它使JVM能够管理线程对象(分配堆栈空间,线程本地,...)以及分支和调度新线程/进程/克隆或架构使用的任何内容的每架构本机工作实现线程。

  

为什么Thread.run()没有向用户公开?

我假设你在谈论堆栈框架的“暴露”。就像静态main方法一样,显然在用户代码之上的调用框架没有向用户公开,因为它们没用,会让人感到困惑。我会对Thread.run()方法说同样的话。如果你扩展Thread并覆盖run()显示在调用堆栈中,但如果你传入目标{em>将不会 1}}。

我在这个答案中有很多关于这方面的细节:

  

How does Java run() method work?

答案 1 :(得分:1)

  

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

当你调用start()时,它启动一个与Thread对象相关联的线程,该对象调用线程的run()方法。

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

  

OR为什么不向用户公开Thread.run()?

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

答案 2 :(得分:0)

当你通过thread.run()开始时,你将它作为一个正常的进程运行,并没有真正将它用作一个线程。它将与主线程连接。使用thread.start(),JVM会分配不与主线程连接的单独线程。

答案 3 :(得分:0)

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

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

如果run()向用户公开,并且它被调用而不是start(),则run()中的代码将在单个调用线程中连续执行。

答案 4 :(得分:0)

someThread.start()调用一个本机方法,告诉JVM创建一个新线程。例如,可以找到热点的血腥细节in the source code

实质上,start()要求操作系统创建一个新线程,然后在新创建的线程中调用Thread#run()方法。

答案 5 :(得分:0)

您开始深入研究JVM本身的实现,因为启动新线程需要与操作系统进行交互。这是JVM中的pretty good mid-level explanation个线程。