2012-03-27 42 views
5

我最近开始使用Java进行多线程编程,使用Java 在Linux线程的情况下,我知道内核调度它们(因为它们是被调度的单元实体),但是Java程序在我的系统(RHEL 6.1 )被实现为一个作为用户空间实例运行的程序。因此,如果内核没有意识到Java线程,那么在JVM中如何实现先占式多任务处理?如果JVM和内核相互作用在做这件事情的整个机制被赋予.Plz引用信息的可能来源Java线程是如何安排的?

+1

不确定,但每个Java线程都由专用的OS线程处理。因此,您的操作系统不需要知道JVM等。 – 2012-03-27 13:54:37

回答

2

Distinguish Java threads and OS threads? 正如我在评论Java线程说是普通的操作系统线程刚刚运行的JVM代码

这将是有帮助
+0

是的,我知道它但plz告诉我如何在此多线程环境中完成Java代码JVM解释器的解释 – Tanay 2012-03-29 14:43:39

+0

除同步操作外,每个线程都将Java代码单独解释为如果它是唯一的线程。当一个新的线程被创建时,它会被告知要解释的java代码。 – 2012-04-05 15:31:26

1

jvm只是一个正常的过程,它从一个线程开始,可以产生尽可能多的线程。调度是在两个级别完成的 - 进程之间和进程内的线程之间。所有这一切都是由操作系统完成的(通过libs) - jvm只是挂钩了。谷歌posix线程的更多细节 - 这是什么暴露(API)的jvm。

这又有点进入细节: http://www.ibm.com/developerworks/java/library/j-rtj3/

3

线程在Java/JVM进程映射到本地线程,你可以看到这两个Java线程ID和线程的堆栈跟踪转储的本地线程ID。用你最喜欢的工具获取所有Java线程的线程堆栈:像CTRL + BREAK

  • 命令行信号控制台(Windows)或按Ctrl + \ Linux的),其中Java程序运行
  • 命令行工具(杀-QUIT或从JDK jstack)
  • 在JDK和/或JMX等视觉VM从这样的线程转储的第一行

实施例提取物: ... TID = 0x0000002adaba9c00 NID = 0x754c ...

  • TID = Java线程ID

  • NID =本地ID(操作系统的线程ID)

使用操作系统的工具来了解更多的线程使用本地ID(它是在十六进制)。

里面你有ThreadMXBean的检索更多线程信息编程,如果你想在Java代码 http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

0

“,但Java程序是在JVM这在我的系统(RHEL 6.1)是 实现为程序运行所运行的用户空间instance.So, 没有内核意识到了java线程的......”

这种说法是不正确的所有现代的JVM使用本地线程。我认为这是自Java 1.2以来的默认值。 由JVM实现的本地线程意味着每次线程在Java代码中实例化/运行线程时,JVM都会要求OS创建该线程。由于这些是本地线程,因此内核知道它们并相应地对待它们。此外,Linux支持/实现POSIX线程,因此在基于Linux的系统上,您将获得适用于Java应用程序线程的pthread行为