【问题标题】: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 没有选择性接收,消息将到达首先唤醒的任何线程。