【问题标题】:Best practice for Java IPCJava IPC 的最佳实践
【发布时间】:2010-09-08 06:20:13
【问题描述】:

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

它应该是高性能的(所以请不要使用 JMS),易于实现且可靠,因此 对象和数据只能绑定到一个线程?

欢迎任何想法!

【问题讨论】:

  • IPC 是“进程间通信”。

标签: java multithreading


【解决方案1】:

你能澄清一下吗?您是指单个 JVM 中的 IPC 吗? (多线程,是的,但在操作系统级别只有一个进程。)或者您的意思是多个 JVM? (以及真正的操作系统级进程间通信。)

如果它是第一个,那么也许 java.util.concurrent 中的某些东西,比如ConcurrentLinkedQueue 就可以解决问题。 (我使用 java.util.concurrent 中的类在我的线程之间传递消息并成功。)

如果是后者,那么我只是猜测并建议查看 RMI,尽管我认为它不符合完全可靠的条件——你必须管理有点“动手”之类的。

【讨论】:

  • RMI 是迄今为止不同 JVM 之间 IPC 的最佳方式。
  • 这并不总是正确的。 RMI 可能很简单,但它确实要求生成存根的接口保持静态,无需更改。 IPC 的选择取决于应用的需要。在某些用例中,消息传递 IPC 机制可能会更好。
  • IPC 是“进程间通信”,java.util.concurrent 中的类是为单个进程的多个线程设计的,而不是不同的进程。
  • @Hugo:感谢-1。不要太执着于标记事物线程或进程。一旦你把它抽象一点,线程和进程在逻辑上是相同的;必须处理同样的问题。最后,这只是一个实施问题。因此,我的回答具有双重性质。
【解决方案2】:

假设场景 1 JVM,多线程那么确实 java.util.concurrent 是要看的地方,特别是各种 Queue 实现。然而,在此之上的抽象可能会很好,Jetlang 看起来非常有趣,是轻量级的 Java 消息传递。

【讨论】:

    【解决方案3】:

    我建议查看整个java.util.concurrent 包,它有多个用于处理并发的类和线程之间的不同通信方式。一切都取决于您想要实现的目标,因为您的问题很笼统。

    【讨论】:

      【解决方案4】:

      您应该使用生产者/消费者队列。通过这样做,您可以避免多线程编程的陷阱:竞争条件和死锁。此外,如果您使用像 Disruptor 或 MentaQueue 这样的无锁队列,它不仅更简单、更清洁,而且速度更快。我写了一篇博客文章,详细讨论了这一点,并展示了如何获得 Inter-thread communication with 2-digit nanosecond latency。

      【讨论】:

      • 您的链接需要基本身份验证。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2019-08-12
        • 2020-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 2012-09-20
        相关资源
        最近更新 更多