4

当程序员调用线程的运行方法时,JVMThread.start()会调用该方法。

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

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

4

6 回答 6

6

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

它执行 JVM 工作来管理线程对象(分配堆栈空间、线程局部变量……)以及每个架构的本地工作,例如分叉和调度新线程/进程/克隆或架构用于实现线程的任何内容。

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

我假设您在堆栈框架方面谈论“暴露”。就像静态main方法一样,用户代码上方的调用框架显然没有暴露给用户,因为它们没有用并且会令人困惑。关于方法,我也会说同样的话Thread.run()如果您Thread扩展和覆盖,它将显示在调用堆栈中,run()但如果您传入 target则不会Runnable

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

Java run() 方法是如何工作的?

于 2012-12-19T18:50:51.060 回答
1

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

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

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

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

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

于 2012-12-19T20:16:04.807 回答
0

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

于 2012-12-19T18:45:07.887 回答
0

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

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

如果run()暴露给用户,并且它被调用而不是start(),那么 in 中的代码run()将在单个调用线程中串行执行。

于 2012-12-19T18:46:04.467 回答
0

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

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

于 2012-12-19T18:55:38.573 回答
0

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

于 2012-12-19T19:04:13.313 回答