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

6
在Java上下文中,线程和进程有什么区别? 在Java中如何实现进程间通信和线程间通信? 请给我一些实际的例子。
4个回答

19

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

实际上,Java线程间通信可以作为适当同步的共享对象上的纯Java方法调用来实现。此外,您还可以使用新的并发类隐藏一些琐碎(以及容易出错)的同步问题。

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

在实际层面上,线程间通信比进程间通信快几个数量级,并允许您更简单地完成许多任务。但缺点是所有内容都必须存在于同一个JVM中,因此存在潜在的可扩展性问题、安全问题、鲁棒性问题等。


6

一个线程可以访问进程内的内存,即使是其他线程可以操作的内存。因为所有线程都属于同一个正在运行的进程,所以它们可以更快地进行通信(因为它们不需要操作系统来仲裁)。

一个进程无法访问另一个进程内部的内存,但是可以通过各种方式进行进程间通信,例如:

  1. 网络数据包。
  2. 文件
  3. 管道
  4. 共享内存
  5. 信号量
  6. Corba 消息
  7. RPC 调用

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

不利的一面是,如果一个线程表现不良,它会在运行的进程内这样做,很有可能会将所有表现良好的线程都关闭。如果一个进程表现不良,它不能直接写入其他进程的内存,而且只有表现不良的进程会死亡的几率较高。


3

线程内通信 (Inter-Thread Communication) = 同一个 JVM 内的线程互相通信

进程间通信 (Inter-Process Communication, IPC) = 在同一台计算机上但运行在不同 JVM 的线程之间进行通信

同一 JVM 内的线程可以使用无锁队列技术来进行流水线通信,延时仅为纳秒级别。

不同 JVM 中的线程可以使用离堆共享内存(通常通过同一内存映射文件获得)进行通信,延时仅为纳秒级别。

不同计算机中的线程可以通过网络进行通信,延时仅为微秒级别。

关于无锁队列和 IPC 的完整解释,请参考CoralQueue

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


2
我喜欢将JVM的单个实例视为一个进程。因此,进程间通信将在JVM实例之间进行,例如通过套接字(消息传递)。
Java中的线程实现Runnable,并包含在JVM内。它们通过在JVM中传递引用来共享数据。每当线程共享数据时,您几乎总是需要保护数据,以防止多个线程相互干扰。有许多保护机制,所有这些机制都涉及防止多个线程进入代码的关键部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接