Java线程如何在内核空间中调度?

Java线程如何在内核空间中调度?,java,multithreading,openjdk,jvm-hotspot,Java,Multithreading,Openjdk,Jvm Hotspot,以下是我对Java线程调度的理解,Java在调用Java.lang.thread类的start()api时在现代OS实现(如solaris 9)上运行线程 之所以使用术语LWP,是因为在内核编程中通常使用术语kernel thread来启动线程 因此,在POSIX、Solaris和Windows平台上,使用java.lang.thread::start()api创建的每个java线程都与使用pthread\u create()或thr\u create()创建的本机线程有1:1映射。反过来,每

以下是我对Java线程调度的理解,Java在调用
Java.lang.thread
类的
start()
api时在现代OS实现(如solaris 9)上运行线程

之所以使用术语
LWP
,是因为在内核编程中通常使用术语
kernel thread
来启动线程

因此,在POSIX、Solaris和Windows平台上,使用
java.lang.thread::start()
api创建的每个
java线程
都与使用
pthread\u create()
thr\u create()
创建的
本机线程
有1:1映射。反过来,每个
本机线程都有一个LWP的1:1映射

我的问题:

(一)

我可以说,在用户空间jvm中没有Java线程调度策略可以根据上图中的1-1线程模型来调度Java线程了吗

(二) 补充的: 在双核处理器场景中,这两个LWP(代表每个JVM进程的一个进程)是否有同等的机会同时执行(并行)


注意:作为一名java初学者,我需要这种清晰的描述。该图详细介绍了jvm的内部工作,以及它如何从低级操作系统线程抽象到java线程模型。这就是JVM在上述操作系统上运行的方式

要直接回答您的问题:

  • )每次创建线程时,都会为操作系统创建一个要管理的线程。JVM在您和操作系统之间有一个抽象层,因此您可以在不同的系统上使用相同的线程模型。通常,对于未优化的java代码,java线程是OS线程

  • )您不能保证并行执行。根据CPU负载的不同,操作系统可能需要更高优先级系统的其他资源。在编写多线程应用程序时,编写时应将线程外发生的一切视为未知


  • 如果您想了解更多关于java多线程模型的信息,我建议您这样做。这本书虽旧,但仍有实用价值。它由Java语言架构师编写,详细介绍了Java多线程模型

    Java线程调度策略@JVM级别可以通过以下选项控制 1) 使用边界线程 2) 调整并发性
    3) Java线程优先级。

    我认为线程调度永远不会在用户空间中完成;它是通过对内核的请求生成的,因此,操作系统必须负责调度——但这并不确定。在Linux中,“内核线程”是指操作系统出于自身目的而使用的线程,与任何用户进程无关(即与JVM无关)。当您谈论由操作系统直接管理的Java线程时,通常将这些线程称为“本机线程”。Java运行时在运行时优化字节码。它可能会发现您正在尝试创建一个线程,而在同一个线程中执行工作会更快。JVM可能会删除创建新线程的调用,也可能不会删除,尽管它存在于代码中。。。是的,这就是我的意思。你们认为JVM提供了线程方面的抽象吗?我不这么认为。一个人真正关心的是,他是否在solaris/linux/windows平台JVM中运行java代码,基于JVM用来启动本机线程的本机(libpthread.so/kernel32.dll/libthread.so)库和操作系统提供的线程模型。因为操作系统级线程模型直接影响java多线程应用程序的性能。JVM通过简化本机库提供了对本机库的抽象。POSIX线程标准提供了比Java线程类和并发类更大的灵活性。我想知道您对这个图是否有意义的反馈,我可以用这种方式描述Java线程的工作吗?我需要对这些有文档记录的语句进行注释,您是否可以使用这些选项(至少使用solaris JVM作为第一个选项)向我显示结果。UseBundThreads提供1x1功能。。如果没有它,则可以在缺少1x1的情况下使用并发来为JVM提供足够的lpw。Java线程优先级还影响线程调度的发生方式。