Java进程间通信和线程间通信?

Posted

技术标签:

【中文标题】Java进程间通信和线程间通信?【英文标题】:Java Inter Process communication and Inter Thread communication? 【发布时间】:2010-03-27 01:57:05 【问题描述】:

Java 上下文中的线程和进程有什么区别? Java中如何实现进程间通信和线程间通信? 请指出一些现实生活中的例子。

【问题讨论】:

【参考方案1】:

根本区别在于线程存在于相同的地址空间中,而进程存在于不同的地址空间中。这意味着线程间通信是关于传递对对象的引用和更改共享对象,而进程是关于传递对象的序列化副本。

在实践中,Java 线程间通信可以实现为对共享对象的普通 Java 方法调用,并引入适当的同步。或者,您可以使用新的并发类来隐藏一些本质(且容易出错)的同步问题.

相比之下,Java 进程间通信是基于将状态、请求等转换为可以作为消息或作为流发送到另一个 Java 进程的字节序列的最低级别。您可以自己完成这项工作,也可以使用各种复杂程度不同的“中间件”技术来抽象出实现细节。可能使用的技术包括,Java 对象序列化、XML、JSON、RMI、CORBA、SOAP/“Web 服务”、消息队列等。

在实际层面上,线程间通信比进程间通信快很多数量级,并且可以让您做很多事情变得更简单。但缺点是一切都必须存在于同一个 JVM 中,因此存在潜在的可扩展性问题、安全性问题、健壮性问题等等。

【讨论】:

【参考方案2】:

线程可以访问进程内的内存,甚至是同一进程内的另一个线程可以操作的内存。由于所有线程都在同一个运行进程内部,因此它们可以更快地通信(因为它们不需要操作系统来裁判)。

一个进程不能访问另一个进程内部的内存,尽管您可以通过各种方式在进程之间进行通信,例如:

    网络包。 文件 管道 共享内存 信号量 Corba 消息 RPC 调用

进程间通信要记住的重要一点是,通信必须通过操作系统进行管理,并且像所有需要中间人的事情一样,这会增加开销。

不利的一面是,如果一个线程行为不端,它会在正在运行的进程中这样做,而且它很有可能会取消所有行为良好的线程。如果一个进程行为不端,它不能直接写入其他进程的内存,很可能只有行为不端的进程会死。

【讨论】:

【参考方案3】:

线程间通信 = 同一 JVM 内的线程相互通信

进程间通信 (IPC) = 同一台机器内的线程,但在不同的 JVM 中运行,相互通信

同一 JVM 中的线程可以使用流水线通过无锁队列以纳秒级延迟相互通信。

不同 JVM 中的线程可以使用堆外共享内存(通常通过同一个内存映射文件获取)以纳秒级延迟相互通信。

不同机器中的线程可以使用网络以微秒级的延迟相互通信。

有关无锁队列和 IPC 的完整说明,您可以查看CoralQueue。

免责声明:我是 CoralQueue 的开发者之一。

【讨论】:

【参考方案4】:

我喜欢将 JVM 的单个实例视为一个进程。因此,进程间通信将在 JVM 实例之间进行,例如,通过套接字(消息传递)。

java 中的线程实现 Runnable 并包含在 JVM 中。它们仅通过在 JVM 中传递引用来共享数据。每当线程共享数据时,您几乎总是需要保护数据,以免多个线程相互干扰。有许多保护机制都涉及防止多个线程进入代码的关键部分。

【讨论】:

以上是关于Java进程间通信和线程间通信?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA线程与线程进程与进程间通信

进程间通信与线程间通信

进程间通信和线程间通信

进程间通信和线程间通信

进程间通信和线程间通信的几种方式

java线程间通信1--简单实例