【问题标题】:How java threads are scheduled?java线程是如何调度的?
【发布时间】:2012-04-11 01:33:18
【问题描述】:

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

请引用可能的信息来源

【问题讨论】:

  • 不确定,但每个 Java 线程都由专用的操作系统线程处理。所以你的操作系统不需要知道 JVM 等。

标签: java multithreading java-threads


【解决方案1】:

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

【讨论】:

  • 是的,我明白了,但请告诉我 JVM 解释器如何在这个多线程环境中完成 Java 代码的解释
  • 除了同步操作之外,每个线程都独立地解释 Java 代码,就好像它是唯一的线程一样。当创建一个新线程时,它会被告知要解释什么 java 代码。
【解决方案2】:

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

这有点详细: http://www.ibm.com/developerworks/java/library/j-rtj3/

【讨论】:

    【解决方案3】:

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

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

    从此类线程转储的第一行中提取的示例: ... tid=0x0000002adaba9c00 nid=0x754c ...

    • tid = java 线程 ID

    • nid = 本机 id(操作系统线程 id)

    使用操作系统的工具来了解更多关于使用本机 id 的线程(它是十六进制的)。

    在 java 代码中,如果需要,您可以使用 ThreadMXBean 以编程方式检索更多线程信息 http://docs.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html

    【讨论】:

      【解决方案4】:

      "但是 java 程序在 JVM 上运行,在我的系统 (RHEL 6.1) 中是 实现为作为用户空间实例运行的程序。所以, 内核不知道 java 线程..."

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

      【讨论】:

        猜你喜欢
        • 2010-09-19
        • 2013-01-02
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 2013-03-14
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        相关资源
        最近更新 更多