2

scala.actors.Actor.self を使用すると、 ForkJoinScheduler作成されます。これは固執し、プログラムが正常に終了しないようにします。Java で記述されたプログラム内で Scala アクターを使用したいと考えており、現在は正常にシャットダウンするスレッド プールを使用しています。ActorにDaemonSchedulerを強制的に使用させることができれば理想的ですが、必要に応じて、明示的な終了コマンドを喜んで発行します。

サンプルコードは次のとおりです。

object EchoActor extends DaemonActor {
  def act() {
    loop {
      react {
        case (x: Any, respondTo: Actor) => {
          println("echoActor Got message " + x)
          respondTo ! "Echoing: " + x
        }
        case msg => println("Can't handle message " + msg)
      }
    }
  }
}

object TestRunner extends App {
  EchoActor.start()
  for (n <- 1 to 3) {
    EchoActor !("Time to echo", self)
    println(self.receiveWithin(1000) { case x => x})
    Actor.clearSelf()   //   <<-- This doesn't allow for graceful shutdown
  }
  Actor.resetProxy()    //   <<-- Neither does this
  println("Done.")
}

Actor.selfを使用できるスレッドが残っていなくても、このプログラムは終了しません。InterruptedExceptionをスローするだけのActor.exit()を呼び出してみましたが、 Actor.selfを完全にあきらめようとしています。何か不足していますか?

アップデート

発見したばかり:

scala.actorsScheduler.shutdown()

これはグローバルな終了のために機能し、今のところ仕事を終わらせます. デフォルトのスケジューラをDaemonSchedulerに変更したいので、方法がわかっている場合は回答を投稿してください。

4

2 に答える 2

0

self があなたに与えるものはActorProxy. AnActorProxyには空がreceiveあり、exitすでに述べたメソッドがあります。他のすべては から継承されActorます。シャットダウンする唯一の方法はexit、例外を呼び出してキャッチすることだと思います。

于 2012-05-01T19:50:28.233 に答える
0

アクターにメッセージを送信して終了します。たとえば、「exit」またはコンパニオン オブジェクトの Exit です。メッセージに反応する部分関数、つまり反応ブロックで、exit() メソッドを呼び出します。私にとっては問題なく動作し、アプリケーションは正常に閉じます。

于 2012-05-02T11:51:07.583 に答える