使用Actor.self后,优雅地终止Scala程序

时间:2012-05-01 15:59:29

标签: scala actor

使用 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 ,因此如果您知道如何,请发布答案。

2 个答案:

答案 0 :(得分:0)

自我给你的是ActorProxyActorProxy有一个空的receive和您已提到的exit方法。其他所有内容都继承自Actor。我认为关闭它的唯一方法是调用exit并捕获异常。

答案 1 :(得分:0)

向演员发送消息以退出,例如“退出”或伴侣对象退出。在对消息作出反应的部分函数中,即反应块,调用exit()方法。对我来说很好,我的应用程序优雅地关闭。