多线程如何在内核空间调度Java线程?
以下是我对Java线程调度的理解:Java在调用运行在现代OS实现(如solaris 9)上的java.lang.Thread
类的start()
api时启动线程
之所以使用术语LWP
,是因为在内核编程中通常使用术语kernel thread
来启动线程
因此,在POSIX、Solaris和Windows平台上,使用java.lang.Thread::start()
api进行的每一次java thread
创建都与使用pthread_create()
或thr_create()
或CreateThread()
进行的native thread
创建有1:1映射。反过来,每个native thread
都有一个带有LWP的1:1映射
我的问题是:
1)
我可以说,用户空间jvm中没有Java线程调度策略,无法再基于上图中的1-1线程模型来调度Java线程了吗
2) 补充的: 在双核处理器场景中,这两个LWP(代表每个JVM进程的一个进程)是否有同等的机会同时执行(并行)
注意:作为一名java初学者,我需要这种清晰度
# 1 楼答案
Java线程调度策略@JVM级别可以通过以下选项控制 1) 使用边界线程 2) 调整并发性 3) Java线程优先级
# 2 楼答案
该图详细说明了jvm的内部工作,以及它如何从较低级别的操作系统线程抽象到java线程模型。这就是JVM在上述操作系统上的运行方式
要直接回答您的问题:
)每次创建线程时,都会创建一个供操作系统管理的线程。JVM在您和操作系统之间有一个抽象层,因此您可以在不同的系统上使用相同的线程模型。一般来说,对于未优化的java代码,java线程就是OS线程
你不能保证并行执行。根据CPU负载的不同,操作系统可能需要更高优先级系统的其他资源。在编写多线程应用程序时,请将线程外发生的事情当作未知来编写
如果你想了解更多关于java多线程模型的信息,我推荐这个book。这本书很旧,但仍有实用价值。它由Java语言架构师编写,详细介绍了Java多线程模型