我想我已经理解了操作系统线程和JVM线程之间的Map(首先我们有1 os:Many-green的“绿色线程”,然后有1:1Map,现在有jep-425,我们有M:NMap的虚拟线程:如果我错了,请纠正我)。然而,我对JVM线程和Thread
示例之间的Map感到非常困惑:我几乎确定start()
-艾德Thread
示例和JVM线程之间存在1:1Map(如果我错了,请再次纠正我),但我不确定JVM线程是在构建Thread
示例时创建的,还是仅在调用start()
方法时才分配堆栈。无论正确答案是什么,我也想知道它是JVM/Java语言规范的一部分,还是实现,如OpenJDK。
2条答案
按热度按时间kmbjn2e31#
首先,你可以尝试创建许多
Thread
对象,然后尝试启动所有这些Thread
:字符串
另一种方法是检查OpenJDK的源代码:
start0()
方法start0
转发到本机JVM_StartThread
型
型
这取决于特定的JVM实现吗?
原则上,它可能取决于特定的JVM实现。然而,在真正需要之前创建操作系统线程是愚蠢的。
我之所以称之为愚蠢的主要原因是资源管理。当你创建一个OS线程时,你也必须销毁它。当你
start()
一个Thread
操作系统线程被创建,线程run()
方法被执行,在该方法返回后,操作系统线程将被销毁。如果一个假设的JVM实现已经在
Thread
构造函数中创建了OS线程,那么当Thread
示例被垃圾收集时,它还需要某种方法来销毁该OS线程,这将是一个麻烦。5ssjco0h2#
只有在调用start()方法时才创建Thread。你可以在这里的JDK文档中查看它:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Thread.html
下面的代码向您展示了这是如何工作的
字符串