Java IPC最佳实践

14

在多线程 Java 应用程序中,最佳的进程间通信方法是什么?

它应该具有高性能(因此请勿使用 JMS),易于实现和可靠,以便将对象和数据绑定到一个线程。

欢迎提出任何想法!


2
IPC 是“进程间通信”的缩写。 - WhyNotHugo
5个回答

14

您能再澄清一下吗?您是指在单个JVM中的IPC吗?(多个线程,但仅限于一个进程的操作系统级别。)还是指多个JVM?(并且真正的操作系统级别的进程间通信。)

如果是前者,那么也许 java.util.concurrent 中的某些东西,比如 ConcurrentLinkedQueue 就可以胜任了。 (我使用 java.util.concurrent 中的类在我的线程之间传递消息取得了成功。)

如果是后者,那我会猜测并建议看看 RMI,尽管我认为它不完全可靠 - 您需要更“手动”地管理它。


RMI是迄今为止在不同JVM之间进行IPC的最佳方式。 - trshiv
这并不总是正确的。RMI 可能很简单,但它需要生成存根的接口保持静态,不进行更改。IPC 的选择取决于应用程序的需求。在某些用例中,消息传递 IPC 机制可能更好。 - gpampara
2
IPC是“进程间通信”,java.util.concurrent中的类是为单个进程的多个线程设计的,而不是不同进程。 - WhyNotHugo
2
@Hugo:谢谢给我投-1的票。不要过分在标记线程或进程上纠结。一旦你将所有东西都抽象化,线程和进程从逻辑上来说是相同的;必须处理相同的问题。最终只是一个实现问题。因此,我的答案具有双重性质。 - Stu Thompson

9
假设场景1中有一个JVM和多个线程,那么确实java.util.concurrent是需要考虑的地方,特别是各种队列实现。然而,在此基础上构建一个抽象层可能会更好,这时候Jetlang就非常有趣了,它是一个轻量级的Java消息传递框架。

4

我刚刚在github上添加了MappedBus (http://github.com/caplogic/mappedbus),它是一种高效的IPC库,可以使多个Java进程/JVM通过交换消息进行通信,并且使用内存映射文件进行传输。吞吐量已经测得可达到每秒4000万条消息。


3
你应该使用生产者/消费者队列。这样做可以避免多线程编程的陷阱:竞争条件和死锁。如果你使用像Disruptor或MentaQueue这样的无锁队列,不仅更容易、更干净,而且速度也更快。我写了一篇博客文章详细介绍了这个问题,并展示了如何实现低于100纳秒的延迟:使用双位数纳秒延迟进行线程间通信

你的链接需要基本认证。 - Dmitry Shevkoplyas

3
我建议您研究整个java.util.concurrent包,其中有多个类用于处理并发和线程之间的不同通信方式。一切都取决于您想要实现什么,因为您的问题比较笼统。

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