Java JVM在调用Thread.run()之前在后台做什么?或者为什么Thread.run()不是';不向用户公开?
当程序员调用Java JVM在调用Thread.run()之前在后台做什么?或者为什么Thread.run()不是';不向用户公开?,java,multithreading,jvm,Java,Multithreading,Jvm,当程序员调用thread.start()时,JVM将调用线程的run方法 在调用Thread.run()之前,JVM在后台做什么 为什么Thread.run()没有向用户公开 当您执行start by thread.run()时,您是将其作为正常进程运行,而不是真正将其作为线程使用。它将与主螺纹连接。通过thread.start(),JVM分配不与主线程连接的单独线程。当您调用start()时,thread类实际上创建了新的JVM线程(与调用线程分离),并从该新线程调用run() 创建新的JVM
thread.start()
时,JVM将调用线程的run方法
Thread.run()
之前,JVM在后台做什么Thread.run()
没有向用户公开当您执行start by thread.run()时,您是将其作为正常进程运行,而不是真正将其作为线程使用。它将与主螺纹连接。通过thread.start(),JVM分配不与主线程连接的单独线程。当您调用
start()
时,thread
类实际上创建了新的JVM线程(与调用线程分离),并从该新线程调用run()
创建新的JVM线程,以便应用程序代码可以有多个运行代码的线程,这是一个低级JVM操作
如果run()
向用户公开,并且调用它而不是start()
,则run()
中的代码将在单个调用线程中串行执行
在调用Thread.run()
之前,JVM在后台做什么
它执行JVM工作来管理线程对象(分配堆栈空间、线程局部变量等)和按体系结构本机工作,即分叉和调度新线程/进程/克隆或体系结构用于实现线程的任何内容
为什么Thread.run()
没有向用户公开
我假设您在谈论堆栈框架中的“暴露”。就像staticmain
方法一样,用户代码上方显然有一些调用帧没有向用户公开,因为它们没有用处,而且会让人困惑。关于Thread.run()
方法,我也会说同样的话。如果扩展Thread
并重写run()
,它将显示在调用堆栈中,但如果传入目标Runnable
,则不会显示
关于这一点,我在回答中有很多细节:
someThread.start()
调用一个本机方法,该方法告诉JVM创建一个新线程。例如,可以找到热点的血淋淋的细节
实质上,
start()
要求操作系统创建一个新线程,然后在新创建的线程中调用thread\run()
方法。您开始深入研究JVM本身的实现,因为启动一个新线程需要与操作系统交互。下面是JVM中的一组线程
JVM在调用Thread.run()之前在后台做什么
调用start()时,它会启动一个与调用线程的run()方法的thread
对象关联的线程
注意:所有创建、启动和调度线程的工作都由操作系统完成。Java只是进行了正确的系统调用。真正起作用的不是JVM代码
或者为什么Thread.run()不向用户公开
它是暴露的。它是公共的,您可以像调用任何其他方法一样调用它。“设置新的JVM线程”,就像在堆栈中分配内存一样?请详细说明。