【问题标题】:Communication between Java thread and OS threadsJava线程和OS线程之间的通信
【发布时间】:2011-04-13 01:02:58
【问题描述】:

据我所知,Java 线程可以使用一些线程 API 进行通信。但我想知道 Java 线程和 OS 线程是如何相互通信的。例如,Java 线程需要等待某个 OS 线程完成其执行并向该 Java 线程返回一些结果,并且它的处理方式相同。

【问题讨论】:

    标签: java multithreading operating-system


    【解决方案1】:

    每个 JVM 实例本质上都是一个 OS 进程。

    【讨论】:

      【解决方案2】:

      这里有很多混淆了线程和进程,jvm 是一个可能产生更多线程的进程。线程是较轻的进程,它们在其进程内共享内存。另一方面,一个进程存在于他自己的地址空间中,这使得上下文切换更加昂贵。您可以通过操作系统提供的 IPC 机制在不同进程之间进行通信,并且由于共享内存和其他技术,您可以在同一进程中的不同线程之间进行通信。你不能通过普通的旧 IPC 从 ThreadA(ProcessA) 到 ThreadA(ProcessB) 进行通信:ThreadA(ProcessA) -> ProcessA -> IPC(OS) -> ProcessB -> ThreadA(ProcessB)).

      您可以使用 RMI 在两个 java 进程之间进行通信,如果您想与本地操作系统进程“对话”,则必须使用 JNI 调用您选择的操作系统提供的 IPC 机制。

      请随时在这里纠正我:)

      旁注: 您无法使用进程管理器查看 JVM 的线程(只要您的 JVM 不将线程映射到本机进程,这将是愚蠢但可能的),您需要使用 jps 和 jstack 来做到这一点。

      【讨论】:

      • 线程就是线程。不要混淆线程和轻量级进程en.wikipedia.org/wiki/Light-weight_process
      • @Jonas 是的,我不想在这里介绍 LWP。将“轻量级”流程更改为“轻量级”流程,这至少不会出错;)
      【解决方案3】:

      Java 线程通常但不一定在本机线程上运行,Java 并发类可以但不一定映射到本机等效项。

      如果您必须在本机线程和 Java 线程之间进行同步,您很可能必须考虑编写 Java 线程调用的 JNI 方法。此 JNI 方法将执行它需要执行的任何本机同步操作,然后返回。每个平台都会以不同的方式执行此操作,但我认为如果您首先需要检查本机线程,这不会是太大的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多