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に変更したいので、方法がわかっている場合は回答を投稿してください。