当程序员调用线程的运行方法时,JVMThread.start()
会调用该方法。
JVM 在调用之前在后台做了什么
Thread.run()
?为什么
Thread.run()
不暴露给用户?
当程序员调用线程的运行方法时,JVMThread.start()
会调用该方法。
JVM 在调用之前在后台做了什么Thread.run()
?
为什么Thread.run()
不暴露给用户?
JVM 在调用之前在后台做了什么
Thread.run()
?
它执行 JVM 工作来管理线程对象(分配堆栈空间、线程局部变量……)以及每个架构的本地工作,例如分叉和调度新线程/进程/克隆或架构用于实现线程的任何内容。
为什么
Thread.run()
不暴露给用户?
我假设您在堆栈框架方面谈论“暴露”。就像静态main
方法一样,用户代码上方的调用框架显然没有暴露给用户,因为它们没有用并且会令人困惑。关于方法,我也会说同样的话Thread.run()
。如果您Thread
扩展和覆盖,它将显示在调用堆栈中,run()
但如果您传入 target则不会Runnable
。
我在这个答案中有很多关于这个的细节:
在调用 Thread.run() 之前,JVM 在后台做了什么?
Thread
当您调用 start() 时,它会启动一个与调用线程的 run() 方法的对象关联的线程。
注意:创建、启动和调度线程的所有工作都由操作系统完成。Java 只是进行正确的系统调用。真正起作用的不是 JVM 代码。
或者为什么 Thread.run() 不向用户公开?
它暴露了。它是公开的,您可以像任何其他方法一样调用它。
当您通过 thread.run() 启动时,您将其作为正常进程运行,而不是真正将其用作线程。它将与主线程连接。使用 thread.start(),JVM 分配不会与主线程连接的单独线程。
当您调用start()
时,Thread
该类实际上创建了新的 JVM 线程(与调用线程分开),并run()
从该新线程调用。
创建新的 JVM 线程,使应用程序代码可以有多个线程运行代码,是一种低级 JVM 操作。
如果run()
暴露给用户,并且它被调用而不是start()
,那么 in 中的代码run()
将在单个调用线程中串行执行。
someThread.start()
调用本机方法,该方法告诉 JVM 创建一个新线程。例如,热点的血腥细节可以在源代码中找到。
实质上,start()
要求操作系统创建一个新线程,然后调用该Thread#run()
新创建线程中的方法。
您开始深入研究 JVM 本身的实现,因为启动新线程需要与操作系统交互。这是 JVM 中线程的一个很好的中级解释。