Java Inter Process通信和Inter Thread通信?

Jav*_*ser 6 java multithreading

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

Ste*_*n C 19

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

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

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

在实际层面上,线程间通信比进程间通信快许多个数量级,并且允许您更简单地执行许多操作.但缺点是一切都必须存在于同一个JVM中,因此存在潜在的可伸缩性问题,安全性问题,健壮性问题等等.

  • @JavaUser - 你的意思是实时或现实生活吗?无论哪种方式,学习这些东西的好方法来自Sun/Oracle广泛的在线教程信息. (3认同)

Edw*_*uck 6

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

虽然您可以通过各种方式在进程之间进行通信,但进程无法访问其他进程内的内存:

  1. 网络包.
  2. 管道
  3. 共享内存
  4. 信号灯
  5. Corba消息
  6. RPC调用

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

在缺点方面,如果一个线程行为不端,它在正在运行的进程中这样做,并且赔率很高,它将能够取消所有表现良好的线程.如果一个进程行为不端,它就不能直接写入其他进程的内存中,而且只有行为不当的进程才会死亡.