线程间通信=同一JVM内的线程相互通信
进程间通信(IPC)=同一台机器内的线程,但在不同的JVM中运行,相互通信
同一JVM中的线程可以通过无锁队列使用流水线技术以纳秒延迟相互通信。
不同JVM中的线程可以使用堆外共享内存(通常通过相同的内存映射文件获取)以纳秒延迟相互通信。
不同机器中的线程可以使用网络以微秒延迟相互通信。
有关无锁队列和IPC的完整说明,您可以查看 CoralQueue 。
的 放弃 强> :我是CoralQueue的开发者之一。
我喜欢将JVM的单个实例视为一个进程。因此,进程间通信将在JVM的实例之间进行,例如,通过套接字(消息传递)。
java中的线程实现了Runnable并包含在JVM中。它们只是通过在JVM中传递引用来共享数据。每当线程共享数据时,您几乎总是需要保护数据,因此多个线程不会相互冲突。有许多保护机制都涉及防止多个线程进入关键代码段。
线程可以访问进程内的内存,甚至是可以由同一进程中的另一个线程操纵的内存。由于所有线程都在同一个运行进程的内部,因此它们可以更快地进行通信(因为它们不需要操作系统来进行裁判)。
虽然您可以通过各种方式在进程之间进行通信,但进程无法访问其他进程内的内存:
处理通信过程中要记住的重要事项是通信必须通过操作系统进行管理,就像所有需要中间人的事情一样,这会增加开销。
在缺点方面,如果一个线程行为不端,它在正在运行的进程中这样做,并且赔率很高,它将能够取消所有表现良好的线程。如果一个进程行为不端,它就不能直接写入其他进程的内存中,而且只有行为不当的进程才会死亡。
根本区别在于线程存在于相同的地址空间中,但进程存在于不同的地址空间中。这意味着线程间通信是关于传递对象的引用和更改共享对象,但是进程是关于传递对象的序列化副本。
实际上,Java的线程间通信可以作为对共享对象的普通Java方法调用实现,并且会引入适当的同步。或者,您可以使用新的并发类来隐藏一些非常严重(并且容易出错)的同步问题。
相比之下,Java进程间通信基于将状态,请求等转换为可以作为消息或作为流发送到另一个Java进程的字节序列的最低级别。您可以自己完成这项工作,也可以使用各种复杂程度的“中间件”技术来抽象出实现细节。可以使用的技术包括Java对象序列化,XML,JSON,RMI,CORBA,SOAP /“Web服务”,消息排队等。
在实际层面上,线程间通信比进程间通信快许多个数量级,并且允许您更简单地执行许多操作。但缺点是一切都必须存在于同一个JVM中,因此存在潜在的可伸缩性问题,安全性问题,健壮性问题等等。