使用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 ,该程序也不会终止。我试过调用Actor.exit(),它只是抛出一个InterruptedException,我正要完全放弃Actor.self。我错过了什么吗?
更新
刚刚发现:
scala.actorsScheduler.shutdown()
这适用于全局终止,并且现在可以完成工作。我希望将默认调度程序更改为DaemonScheduler,所以如果您知道如何,请发布答案。