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 ,该程序也不会终止。我试过调用Actor.exit(),它只是抛出一个InterruptedException,我正要完全放弃Actor.self。我错过了什么吗?

更新

刚刚发现:

scala.actorsScheduler.shutdown()

这适用于全局终止,并且现在可以完成工作。我希望将默认调度程序更改为DaemonScheduler,所以如果您知道如何,请发布答案。

4

2 回答 2

0

Send a message to the actor to exit, eg "exit" or the companion object Exit. In the partial function which reacts to messages, ie the react block, call the exit() method. Works fine for me and my application closes gracefully.

于 2012-05-02T11:51:07.583 回答
0

self 给你的是一个ActorProxy. AnActorProxy有一个空receive的和exit你已经提到的方法。其他一切都继承自Actor. 我认为关闭它的唯一方法是调用exit并捕获异常。

于 2012-05-01T19:50:28.233 回答