如果我打电话
actorRef.tell("MSG", null);
来自非演员
它仍然是线程安全的吗?和async一样立即完成?
消息是不可变的。
基本上我的代码是:
class NonActor {
....
public void tellTest() {
actorRef.tell("MSG", null);
}
}
答案 0 :(得分:5)
基本上actorRef.tell("MSG", null);
会创建一个类似
(actorRef, Envelope(msg, sender))
并将其放入ActorSystem
的消息队列中。因此tell
没有以任何方式链接到演员。 tell
方法本身无疑是线程安全的。
答案 1 :(得分:1)
它是否是线程安全的,取决于你的应用程序的其余部分。演员本身并不是线程安全的;您可以像使用任何应用程序实体一样共享可变状态。但tell
调用将立即返回,因为它是异步的。
答案 2 :(得分:1)
只需使用!
运算符。
在Akka classic 2.6中定义如下:
trait ScalaActorRef { ref: ActorRef =>
/**
* Sends a one-way asynchronous message. E.g. fire-and-forget semantics.
* <p/>
*
* If invoked from within an actor then the actor reference is implicitly passed on as the implicit 'sender' argument.
* <p/>
*
* This actor 'sender' reference is then available in the receiving actor in the 'sender()' member variable,
* if invoked from within an Actor. If not then no sender is available.
* <pre>
* actor ! message
* </pre>
* <p/>
*/
def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit
}
actorRef.tell("MSG", null)
类似于actorRef.!("MSG")(null)
,强制发送者为null
。
如果您在Actor外部使用!
,则将找不到隐式发送者,因此编译器将使用默认值Actor.noSender
。
只要应该在编译时自动解决不存在发件人的问题,就明确告诉Akka null
可能容易出错。
从不使用null
是Scala!
答案 3 :(得分:0)
null as sender意味着接收actor无法执行sender()。tell()来回复你的消息。