我最近开始在 Linux 线程的情况下使用 Java 进行多线程编程,我知道内核会调度它们(因为它们是被调度的单元实体)但是 java 程序运行在我的系统(RHEL 6.1)中的 JVM 上是实现为作为用户空间实例运行的程序。那么,在内核不知道 java 线程的情况下,如何在 JVM 中完成抢占式多任务处理?如果给出做这件事时 JVM 和内核交互的整个机制将会很有帮助。
请引用可能的信息来源
我最近开始在 Linux 线程的情况下使用 Java 进行多线程编程,我知道内核会调度它们(因为它们是被调度的单元实体)但是 java 程序运行在我的系统(RHEL 6.1)中的 JVM 上是实现为作为用户空间实例运行的程序。那么,在内核不知道 java 线程的情况下,如何在 JVM 中完成抢占式多任务处理?如果给出做这件事时 JVM 和内核交互的整个机制将会很有帮助。
请引用可能的信息来源
java/JVM 进程中的线程映射到本地线程,您可以在线程堆栈跟踪转储中看到 java 线程 id 和本地线程 id。使用您喜欢的工具获取所有 java 线程的线程堆栈:
从此类线程转储的第一行中提取示例: ... tid=0x0000002adaba9c00 nid=0x754c ...
tid = java线程id
nid = 本机 id(操作系统线程 id)
使用操作系统的工具来了解有关使用本机 id 的线程的更多信息(它是十六进制的)。
阅读区分 Java 线程和 OS 线程? 正如我在评论中所说,Java 线程是仅运行 JVM 代码的普通操作系统线程
jvm 只是一个正常的进程,它从一个线程开始,然后可以生成它喜欢的尽可能多的线程。调度在两个级别上完成 - 进程之间和进程内的线程之间。所有这些都是由操作系统(通过库)完成的——jvm 只是挂钩。谷歌 posix 线程了解更多细节——这就是 jvm 暴露的内容(API)。
这有点详细: http ://www.ibm.com/developerworks/java/library/j-rtj3/
“但是java程序在JVM上运行,在我的系统(RHEL 6.1)中被实现为作为用户空间实例运行的程序。所以,内核不知道java线程......”
对于所有使用本机线程的现代 JVM,此语句是不正确的。我认为这是自 Java 1.2 以来的默认设置。JVM 的本机线程实现意味着每次线程在 Java 代码中实例化/运行线程时,JVM 都会要求操作系统创建线程。由于这些是本机线程,内核知道它们并相应地对待它们。此外,Linux 支持/实现 POSIX 线程,因此在基于 Linux 的系统上,您将获得 Java 应用程序线程的 pthread 行为