如何安排java线程?

时间:2012-03-27 13:50:40

标签: java multithreading java-threads

我最近用Java开始了多线程编程 在Linux线程的情况下,我知道内核调度它们(因为它们是被调度的单元实体)但是java程序在JVM上运行,在我的系统(RHEL 6.1)中,JVM实现为以用户身份运行的程序如果没有内核知道java线程,那么如何在JVM中完成抢占式多任务处理?如果给出JVM和内核交互的整个机制,那将会很有帮助。

请引用可能的信息来源

4 个答案:

答案 0 :(得分:3)

java / JVM进程中的线程映射到本机线程,您可以在线程堆栈跟踪转储中看到java线程标识和本机线程标识。使用您最喜欢的工具获取所有Java线程的线程堆栈:

  • 命令行信号,如ctrl + break(windows)或ctrl + \ linux)在运行java程序的控制台中
  • 命令行工具(从jdk中杀死-QUIT或jstack)
  • jdk中的visual vm和/或jmx等

来自此类线程转储的第一行的示例摘录:     ... 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行为