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