据我所知,Java线程可以使用一些线程API进行通信。但我想知道Java线程和OS线程是如何相互通信的。例如,Java线程需要等待一些OS线程完成其执行并将一些结果返回给这个Java线程并且它处理相同的。
答案 0 :(得分:6)
许多人在这里混淆了线程和进程,jvm是一个可能产生更多线程的进程。线程是较轻的进程,在其进程中共享内存。另一方面,进程存在于他自己的地址空间中,这使得上下文切换更加昂贵。您可以通过操作系统提供的IPC机制在不同进程之间进行通信,并且由于共享内存和其他技术,您可以在同一进程中的不同线程之间进行通信。你不能通过简单的旧IPC从ThreadA(ProcessA)到ThreadA(ProcessB)进行通信:ThreadA(ProcessA) -> ProcessA -> IPC(OS) -> ProcessB -> ThreadA(ProcessB)).
您可以使用RMI在两个java进程之间进行通信,如果您想与本机OS进程“对话”,则必须使用JNI来调用您选择的操作系统提供的IPC机制。
欢迎在此纠正我:)
旁注: 您无法使用进程管理器查看JVM的线程(只要您的JVM不将线程映射到本机进程,这可能是愚蠢但可能),您需要使用jps和jstack来执行此操作。
答案 1 :(得分:0)
每个JVM实例本质上都是一个操作系统进程。
答案 2 :(得分:-1)
Java线程通常但不一定在本机线程上运行,Java并发类可以但不一定映射到本机等效项。
如果必须在本机线程和Java线程之间进行同步,则很可能必须考虑编写Java线程调用的JNI方法。此JNI方法将执行它需要执行的任何本机同步操作,然后返回。每个平台都会以不同的方式执行此操作,但我认为如果您需要首先检查本机线程,这不会是一个太大的问题。