【问题标题】:Erlang JInterface - is OtpMBox thread-safe?Erlang JInterface - OtpMBox 线程安全吗?
【发布时间】:2010-09-21 23:17:13
【问题描述】:

在我的 Java 程序中,我创建了一个 OtpNode 和一个“命名”OtpMBox。每当通过此 mbox 接收到消息时,都需要执行一些耗时的操作,然后将回复消息发送回。由于此操作非常耗时,因此不会立即处理发送到 mbox 的后续消息。

所以我想使用 Java 线程 - 每收到一条消息一个。我的问题是我应该为收到的每条消息创建一个新的OtpMBox,还是可以在所有线程之间共享原始 OtpMBox?

【问题讨论】:

    标签: java multithreading erlang thread-safety jinterface


    【解决方案1】:

    我对这些东西不是很熟悉,但我想你可能会做一些计算) 您有为每个 java 线程运行 OtpMBox 的开销和控制系统(用 java 编写)的开销,这会要求不同的线程做一些工作并从中获取结果。我相信java不是它的好工具)

    你最好做 java-thread 'supervisor',它会使用 OtpMBox 启动一些(可能是 CPU 数量)数量的 'worker' java-threads 并将 OtpMBox 的 pids 发送到 erlang 系统。

    --对不起我的英语

    【讨论】:

      【解决方案2】:

      听起来您正在尝试使用 java 来做 erlang 擅长的事情。安全的轻量级多处理。是否有理由需要使用 java 进行处理,是否可以在 erlang 中完成?或者相反,如果java无论如何都要执行线程,为什么要使用erlang。我认为也许更多信息有助于回答这个问题。

      【讨论】:

        【解决方案3】:

        我不确定我是否理解这个问题。您希望每个线程都有一个 OtpMBox 只是为了能够发送回复,还是这个长时间运行的操作必须能够接收更多消息?

        如果是前者,您可以重复使用原来的 mbox。发送操作已同步。

        如果是后者,最好采用 Erlang 的方式,为每个线程创建一个 mbox,并让来自 erlang 端的调用者知道它的 pid,以便它可以向该 mbox 发送数据。这是因为 jinterface 没有选择性接收,消息将到达首先唤醒的任何线程。

        【讨论】:

          【解决方案4】:

          您可以共享 OtpMBox 对象并在多个线程中使用它。这个erlang-questions thread about jinterface threadsafety 讨论了这个问题。

          另外,对于纯 java 特定的问题,您可能希望使用 ThreadPoolExecutor from java.util.concurrent 来处理到达的消息。

          【讨论】:

            猜你喜欢
            • 2020-03-15
            • 2015-06-30
            • 2013-02-17
            • 2020-04-15
            • 2011-07-04
            • 2014-04-26
            • 2012-11-30
            • 2010-12-30
            • 2013-03-12
            相关资源
            最近更新 更多