7

私が電話するなら

actorRef.tell("MSG", null);

役者じゃない人から

まだスレッドセーフですか?そして、非同期はすぐに完了しますか?

メッセージは不変です。

基本的に私のコードは次のとおりです。

class NonActor {
    ....

    public void tellTest() {

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

4 に答える 4

1

スレッドセーフかどうかは、アプリの残りの部分に依存します。アクターは本質的にスレッドセーフではありません。任意のアプリケーション エンティティと同じように、変更可能な状態を共有できます。ただし、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.noSender、コンパイラによってデフォルト値が設定されます。

送信者の不在がコンパイル時に自動的に解決されることになっている限り、Akka にそれを明示的に伝えると、nullバグが発生しやすくなる可能性があります。

nullScala は絶対に使用しないでください。

于 2020-02-01T22:24:53.280 に答える