2010-09-16 116 views
3

就我所知,Java线程可以使用某些线程API进行通信。但是我想知道Java线程和OS线程是如何相互通信的。例如,Java线程需要等待某个操作系统线程完成其执行,并将一些结果返回给此Java线程,并且它的处理过程相同。Java线程和操作系统线程之间的通信

回答

6

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

可以使用RMI两个Java进程间通信,如果要“对话”原生OS进程,你必须去JNI调用你选择的操作系统提供的IPC机制。

欢迎随时指正:)

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

+0

线程为线程。不要混淆线程和**轻量级进程**:http://en.wikipedia.org/wiki/Light-weight_process – Jonas 2010-09-16 08:45:50

+0

@Jonas是的,我不想在这里介绍LWP。将“轻量级”更改为“更轻”的过程,这至少不会出错;) – atamanroman 2010-09-16 09:01:59

0

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

+1

OS进程与OS线程不同。 – Jonas 2010-09-16 08:57:47

+0

胜一天 – hakish 2010-09-16 09:26:49

-1

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

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