Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java线程和OS线程之间的通信_Java_Multithreading_Operating System - Fatal编程技术网

Java线程和OS线程之间的通信

Java线程和OS线程之间的通信,java,multithreading,operating-system,Java,Multithreading,Operating System,据我所知,Java线程可以使用一些线程API进行通信。但是我想知道Java线程和OS线程是如何相互通信的。例如,一个Java线程需要等待某个操作系统线程完成其执行,并向该Java线程返回一些结果,然后它进行相同的处理。JVM的每个实例本质上都是一个操作系统进程。Java线程通常但不一定在本机线程上运行,Java并发类可以但不一定映射到本机线程上本地等价物 如果你必须在本地线程和java线程之间同步,你将很可能不得不考虑编写java线程调用的JNI方法。这个JNI方法将执行它需要执行的任何本机同步

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

JVM的每个实例本质上都是一个操作系统进程。

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


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

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

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

请随意在这里纠正我:)

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

线程就是线程。不要混淆线程和轻量级进程:@Jonas yep,我不想在这里介绍LWP。将“轻量级”流程更改为“轻量级”流程,这至少不那么错误;)