在我的 Java 程序中,我创建了一个OtpNode和一个“命名的” OtpMBox。每当通过此 mbox 接收到消息时,需要执行一些耗时的操作,然后将回复消息发送回。由于此操作非常耗时,因此不会立即处理发送到 mbox 的后续消息。
所以我想使用 Java 线程——每收到一条消息。我的问题是我是否也应该为收到的每条消息创建一个新的OtpMBox,还是可以在所有线程之间共享原始 OtpMBox?
您可以共享 OtpMBox 对象并从多个线程中使用它。这个关于 jinterface 线程安全的 erlang-questions 线程讨论了这个问题。
此外,对于纯 Java 特定问题,您可能希望使用java.util.concurrent 中的 ThreadPoolExecutor来处理到达的消息。
我不确定我是否理解这个问题。您希望每个线程都有一个 OtpMBox 只是为了能够发送回复,或者这个长时间运行的操作是否必须能够接收更多消息?
如果是前者,您可以重用原来的 mbox。发送操作是同步的。
如果是后者,最好采用 Erlang 方式,为每个线程创建一个 mbox,并让来自 erlang 端的调用者知道它的 pid,以便它可以将数据发送到该 mbox。这是因为 jinterface 没有选择性接收,并且消息将到达首先唤醒的任何线程。
我对这些东西不是很熟悉,但我想你可能会做一些计算)你有为每个 java 线程运行 OtpMBox 的开销和控制系统(用 java 编写)的开销,这会要求不同的线程做一些工作和从他们那里得到结果。我相信java不是它的好工具)
你最好做 java-thread 'supervisor',它将使用 OtpMBox 启动一些(可能是 CPU 数量)数量的 'worker' java-threads 并将 OtpMBox 的 pids 发送到 erlang 系统。
--对不起我的英语
听起来您正在尝试使用 java 来做 erlang 擅长的事情。安全的轻量级多处理。是否有理由需要使用 java 进行处理,是否可以在 erlang 中完成?或者相反,如果java无论如何都要执行线程,为什么要使用erlang。我认为也许更多信息有助于回答这个问题。