首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java进程间通信和线程间通信?

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

Stack Overflow用户
提问于 2010-03-27 09:57:05
回答 4查看 13.1K关注 0票数 6

在Java上下文中,线程和进程有什么不同?Java是如何实现进程间通信和线程间通信的?请给我举一些现实生活中的例子。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-27 10:10:22

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

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

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

在实际层面上,线程间通信比进程间通信快许多个数量级,并且允许您更简单地完成许多事情。但缺点是,所有的东西都必须存在于同一个JVM中,因此存在潜在的可伸缩性问题、安全性问题、健壮性问题等等。

票数 19
EN

Stack Overflow用户

发布于 2010-03-27 13:39:50

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

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

  1. 网络packages.
  2. Files
  3. Pipes
  4. Shared Memory
  5. Semaphores
  6. Corba messages
  7. RPC calls

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

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

票数 6
EN

Stack Overflow用户

发布于 2015-05-01 11:00:12

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

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

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

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

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

有关无锁队列和进程间通信的完整解释,可以查看CoralQueue

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2527847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档