7

如果我打电话

actorRef.tell("MSG", null);

来自非演员

它仍然是线程安全的吗?并且 async as in 立即完成?

消息是不可变的。

基本上我的代码是:

class NonActor {
    ....

    public void tellTest() {

         actorRef.tell("MSG", null);
    }
}
4

4 回答 4

7

基本上actorRef.tell("MSG", null);创建了一个像

(actorRef, Envelope(msg, sender))

并将其放入ActorSystem的消息队列中。因此tell与演员没有任何联系。该tell方法本身无疑是线程安全的。

于 2013-09-08T12:02:22.927 回答
1

它是否是线程安全的取决于您的应用程序的其余部分。Actor 本身并不是线程安全的。您可以像与任何应用程序实体一样共享可变状态。但是tell调用会立即返回,因为它是异步的。

于 2013-09-05T20:41:46.637 回答
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可能是容易出错的。

永远不要使用nullScala !

于 2020-02-01T22:24:53.280 回答
0

null as sender 表示接收参与者无法执行 sender().tell() 来回答您的消息。

于 2017-10-04T12:47:59.313 回答