【发布时间】:2010-09-08 06:20:13
【问题描述】:
在多线程 Java 应用程序中进行进程间通信的最佳方法是什么。
它应该是高性能的(所以请不要使用 JMS),易于实现且可靠,因此 对象和数据只能绑定到一个线程?
欢迎任何想法!
【问题讨论】:
-
IPC 是“进程间通信”。
标签: java multithreading
在多线程 Java 应用程序中进行进程间通信的最佳方法是什么。
它应该是高性能的(所以请不要使用 JMS),易于实现且可靠,因此 对象和数据只能绑定到一个线程?
欢迎任何想法!
【问题讨论】:
标签: java multithreading
你能澄清一下吗?您是指单个 JVM 中的 IPC 吗? (多线程,是的,但在操作系统级别只有一个进程。)或者您的意思是多个 JVM? (以及真正的操作系统级进程间通信。)
如果它是第一个,那么也许 java.util.concurrent 中的某些东西,比如ConcurrentLinkedQueue 就可以解决问题。 (我使用 java.util.concurrent 中的类在我的线程之间传递消息并成功。)
如果是后者,那么我只是猜测并建议查看 RMI,尽管我认为它不符合完全可靠的条件——你必须管理有点“动手”之类的。
【讨论】:
假设场景 1 JVM,多线程那么确实 java.util.concurrent 是要看的地方,特别是各种 Queue 实现。然而,在此之上的抽象可能会很好,Jetlang 看起来非常有趣,是轻量级的 Java 消息传递。
【讨论】:
我建议查看整个java.util.concurrent 包,它有多个用于处理并发的类和线程之间的不同通信方式。一切都取决于您想要实现的目标,因为您的问题很笼统。
【讨论】:
您应该使用生产者/消费者队列。通过这样做,您可以避免多线程编程的陷阱:竞争条件和死锁。此外,如果您使用像 Disruptor 或 MentaQueue 这样的无锁队列,它不仅更简单、更清洁,而且速度更快。我写了一篇博客文章,详细讨论了这一点,并展示了如何获得 Inter-thread communication with 2-digit nanosecond latency。
【讨论】:
我刚刚在 github (http://github.com/caplogic/mappedbus) 上添加了 MappedBus,这是一个高效的 IPC 库,它使多个 Java 进程/JVM 能够通过交换消息进行通信,并且它使用内存映射文件进行传输。吞吐量已测量为 4000 万条消息/秒。
【讨论】: