我尝试使用Scala的actors API实现一个计时器,当前的Thread 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
请告诉我解决问题的方法。
答案 0 :(得分:6)
你有两种类型的控制传递与scala-actors,线程阻塞或线程暂停。后者表示抛出控制异常(线程再次可用于线程池管理器),并且当消息进入其邮箱时重新执行actor主体。有关详细信息,请参阅actors tutorial,尤其是“让它无线!”一节。
receiveWithin
方法使用线程阻塞,reactWithin
使用暂停。你在这里遇到的问题是没有外部管理参与者捕获异常。这仅适用于“适当的”actor,而不适用于为主线程创建的代理。因此,如果您想在显式actor之外的主线程上等待,则需要使用线程阻塞/ receiveWithin
:
self.receiveWithin(1000) { ... }