我想知道在调用start()
方法之前,Thread
的示例是否只是一个标准的Java对象,或者是否从创建它们的那一刻起就分配了一些特殊的JVM/OS级别的资源(例如为它们的堆栈预先分配内存等)。根据初步的研究,它们看起来像普通的对象,但如果一些JVMMaven能够证实这一点,那就太棒了。
我最关心的是前面提到的线程的堆栈内存,因为JVM规范指出 “每个Java虚拟机线程都有一个私有的Java虚拟机堆栈,与线程同时创建”。我想知道 “created” 是否指的是对start()
方法的调用或正在构造的Thread
示例(老实说,我不知道OS线程、JVM线程和Thread
对象之间的确切关系,因此我感到困惑。我也想我可能听说过它在过去几年里发生了一些变化,但我记不清了)。此外,我猜测,即使在构建Thread
示例时分配了一些操作系统虚拟内存的情况下,其堆栈的实际物理内存页面也只会在线程开始使用之后分配,我再次猜测,这只是在start()
-ed之后。
这就是“我可能听说过的变化”:jep-425在java-19中引入。它将OS线程和JVM线程之间的Map更改为M:N。然而,我仍然不确定Thread
对象和JVM线程之间的Map(我几乎确定start()
-艾德Thread
对象和JVM线程之间的Map是1:1,但不确定JVM线程是在Thread
示例创建时创建的还是在start()
上创建的。我问过another question regarding this)
2条答案
按热度按时间rks48beu1#
尽管
Thread
构造函数执行了相当多的检查和初始化,但它不会将Thread
示例绑定到本机OS线程。这只会发生在Thread.start()
上,所以从这个意义上说,未启动的Thread不是一个“重”对象(我的意思是,它没有本地对等体)。可能最昂贵的部分是,如果
Thread
是用inheritThreadLocals
设置为true
构造的(这发生在Thread
的许多常见构造器中),并且创建线程在其map中有许多线程本地值。也就是说,重申我对这个问题的评论,创建很多线程而不启动它们是不寻常的,通常表明你做错了什么(例如。扩展
Thread
而不是实现Runnable
),您可能需要寻找替代方案。58wvjzkj2#
在调用**start()**方法之前,Thread示例都是普通的Java Object,操作系统级的资源在Thread启动时由JVM分配,由JVM和操作系统管理。
**注意:**OS_Level资源是OS提供的组件和能力,用于管理和控制计算机系统中的进程和线程,包括:程序计数器(PC),线程调度,线程优先级,线程控制块(TCB)