使用 scala.actors.Actor.self 创建一个 ForkJoinScheduler ,它可以防止程序正常终止。我想在用Java编写的程序中使用Scala actor,并且当前使用的线程池优雅地关闭。如果我能强迫 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 ,因此如果您知道如何,请发布答案。
答案 0 :(得分:0)
自我给你的是ActorProxy
。 ActorProxy
有一个空的receive
和您已提到的exit
方法。其他所有内容都继承自Actor
。我认为关闭它的唯一方法是调用exit
并捕获异常。
答案 1 :(得分:0)
向演员发送消息以退出,例如“退出”或伴侣对象退出。在对消息作出反应的部分函数中,即反应块,调用exit()方法。对我来说很好,我的应用程序优雅地关闭。