4

Scala のアクター API に基づいてタイマーを実装しようとしました。現在の Thread アクター (Actor.self) をタイマーとして使用し、時間内に完了する必要がある作業を実行する匿名のアクターを使用しました。次の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-blockingまたはthread-suspensionの 2 種類があります。後者は、制御例外がスローされ (スレッドがスレッド プール マネージャーで再び使用可能になる)、メッセージがメールボックスに到着したときにアクター本体が再実行されることを意味します。詳細については、アクターのチュートリアルを参照してください。セクション「スレッドレスにしよう!」

このreceiveWithin方法では、スレッドブロッキングとreactWithinサスペンションが使用されます。ここでの問題は、例外をキャッチする外部管理アクターがないことです。これは「適切な」アクター内でのみ機能し、メイン スレッド用に作成されたプロキシでは機能しません。したがって、明示的なアクターの外部でメイン スレッドを待機する場合は、スレッド ブロッキング / を使用する必要がありますreceiveWithin

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