当程序员调用Thread.start()
时,JVM会调用线程的run方法。
在致电Thread.run()
之前,JVM在后台做了什么?
为什么Thread.run()
没有向用户公开?
答案 0 :(得分:6)
在调用
Thread.run()
之前,JVM在后台做了什么?
它使JVM能够管理线程对象(分配堆栈空间,线程本地,...)以及分支和调度新线程/进程/克隆或架构使用的任何内容的每架构本机工作实现线程。
为什么
Thread.run()
没有向用户公开?
我假设你在谈论堆栈框架的“暴露”。就像静态main
方法一样,显然在用户代码之上的调用框架没有向用户公开,因为它们没用,会让人感到困惑。我会对Thread.run()
方法说同样的话。如果你扩展Thread
并覆盖run()
,将显示在调用堆栈中,但如果你传入目标{em>将不会 1}}。
我在这个答案中有很多关于这方面的细节:
答案 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个线程。