2012-07-26 88 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