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()
    没有向用户公开

    我假设您在谈论堆栈框架中的“暴露”。就像static
    main
    方法一样,用户代码上方显然有一些调用帧没有向用户公开,因为它们没有用处,而且会让人困惑。关于
    Thread.run()
    方法,我也会说同样的话。如果扩展
    Thread
    并重写
    run()
    ,它将显示在调用堆栈中,但如果传入目标
    Runnable
    ,则不会显示

    关于这一点,我在回答中有很多细节:

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


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

    您开始深入研究JVM本身的实现,因为启动一个新线程需要与操作系统交互。下面是JVM中的一组线程

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

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

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

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


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

    “设置新的JVM线程”,就像在堆栈中分配内存一样?请详细说明。