我最近开始用Java多线程编程,在Linux线程的情况下,我知道内核调度它们(因为它们是被调度的单位实体),但是Java程序运行在JVM上,这在我的系统(RHEL6.1)中是作为用户空间实例.So运行的程序,而内核不知道Java线程,为什么抢占式多任务是在JVM中完成的?如果能给出JVM和内核交互的整个机制来完成这件事,那将是很有帮助的。
请列举可能的信息来源
发布于 2012-03-27 22:24:17
java/JVM进程中的线程映射到本机线程,您可以在线程堆栈跟踪转储中看到java线程id和本机线程id。使用您喜欢的工具获取所有java线程的线程堆栈:
在控制台中的命令行信号,如ctrl+break (windows)或ctrl+\ linux),其中java程序是jdk中的行工具(从jdk中杀死-QUIT或jstack )
从这样的线程转储的第一行提取示例:...tid=0x0000002adaba9c00 nid=0x754c ...
使用操作系统的工具查找有关使用本机id (十六进制)的线程的更多信息。
在java代码内部,如果需要http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html,您可以使用ThreadMXBean以编程方式检索更多线程信息
发布于 2012-03-27 21:56:34
阅读Distinguish Java threads and OS threads?,正如我在评论中所说的那样,Java线程是普通的操作系统线程,只是运行Java虚拟机代码
发布于 2012-03-27 22:23:54
jvm只是一个普通的进程,它从一个线程开始,然后可以生成任意多个线程。调度是在两个级别上完成的-进程之间和进程内的线程之间。所有这些都是由OS (通过libs)完成的-- jvm只需挂入即可。Google posix线程以获取更多细节-这就是向jvm公开(API)的内容。
这涉及到一些细节:http://www.ibm.com/developerworks/java/library/j-rtj3/
https://stackoverflow.com/questions/9890900
复制相似问题