なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Balking

 Guarded Suspensionに似ているが、
こちらは要求を受ける側は、キューにメッセージがない場合、待たずに処理を抜ける。
  
 reactの代わりにreactWithinを用いると、待ち時間のタイムアウトをミリ秒単位で設定できる。
引数に0を設定するとメッセージが存在しない場合即座にタイムアウト
勿論、任意の値を設定できる。
 

import scala.actors._
import Actor._
import java.lang.Thread._

object Main {
def main(args: Array[String]) = {
// scala.actors.Actorの関数。Actorを生成する
val anActor = actor {
// reactは一度メッセージを受け取ると処理を抜けるのでループ
loop {
reactWithin(0) {
// タイムアウトしたら約1秒sleep = 約1秒毎にキューを確認
case TIMEOUT => {
println("TimeOut!")
sleep(1000)
}
case msg => println("Receive Message: " + msg)
}
}
}

anActor ! "約0.0秒後"
sleep(500)
anActor ! "約0.5秒後"
sleep(2000)
anActor ! "約2.5秒後"
sleep(7500)
anActor ! "約10.0秒後"
}
}

実行結果


Receive Message: 約0.0秒後
TimeOut!
Receive Message: 約0.5秒後
TimeOut!
TimeOut!
Receive Message: 約2.5秒後
TimeOut!
TimeOut!
TimeOut!
TimeOut!
TimeOut!
TimeOut!
TimeOut!
Receive Message: 約10.0秒後
TimeOut!
TimeOut!