4

我尝试实现一个基于 Scala 的 Actor API 的计时器,当前线程 Actor (Actor.self) 作为计时器,一个匿名 Actor 执行需要及时完成的​​工作。我有以下 Scala 程序

import scala.actors.Actor.self
import scala.actors.TIMEOUT

object Main {
  def main(args: Array[String]): Unit = {
    val thiz = self
    actor {
      // do heavy work here
      thiz ! "finish"
    }
    self.reactWithin(1000) { 
      case "finish" => println("complete")
      case TIMEOUT  => println("timeout")
    }
  }
}

当我运行程序时,我收到了

Exception in thread "main" scala.actors.SuspendActorControl
scala.actors.ActorProxy@1d99a4d: caught java.lang.InterruptedException

请告诉我解决问题的方法。

4

1 回答 1

6

你有两种通过 scala-actors 传递的控制,thread-blockingthread-suspension。后者意味着抛出一个控制异常(线程再次对线程池管理器可用),并且当消息进入其邮箱时重新执行actor主体。有关更多详细信息,请参阅演员教程,尤其是。“使其无线程!”部分。

receiveWithin方法使用线程阻塞和reactWithin暂停。您在这里遇到的问题是没有捕获异常的外部管理参与者。这仅适用于“适当的”actor,不适用于为主线程创建的代理。因此,如果您想在显式参与者之外等待主线程,则需要使用线程阻塞 / receiveWithin

self.receiveWithin(1000) { ... }
于 2012-07-27T00:58:23.037 回答