2012-07-26 86 views
4

我试图实现一个基于Scala的actors API的定时器,当前的Thread actor(Actor.self)作为定时器和一个匿名Actor来完成需要及时完成的​​工作。 我有以下斯卡拉程序scala actor拦截当前线程

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 
[email protected]: caught java.lang.InterruptedException 

请告诉我克服问题的办法。

回答

6

你有两种类型的控制传递给scala-actors,线程阻塞线程暂停。后者意味着引发了一个控制异常(线程再次可用于线程池管理器),并且在消息进入其邮箱时重新执行actor主体。有关更多详情,请参阅actors tutorial,尤其是。 “让它无线!”部分。

​​方法使用线程阻塞和reactWithin暂停。你在这里遇到的问题是没有捕捉异常的外部管理参与者。这只适用于“合适”的参与者,而不是为主线程创建的代理。所以,如果你想在主线程等待一个明确的演员外,你需要使用线程阻塞/​​:

self.receiveWithin(1000) { ... } 
+0

谢谢你,你的答案是什么我要找的。对不起,但我没有足够的声望投票给你:) – user1503000 2012-07-27 04:06:19