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