なんじゃくにっき

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

Scala de Design Pattern: Thread Specific Storage

 スレッド毎に固有の記憶領域を割り当てるパターン。
Javaの場合、java.lang.ThreadLocalを用いる。
 
 ScalaのActorはスレッドプール上で動作するので、ActorとThreadは1対1対応ではない。
なのでThreadLocalを用いるわけにはいかない。
 
 呼び出し元のActorの毎に記憶域を分けたいなら、
senderのHashCodeで分ければいいのかな・・?
 

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

object Logger extends Actor {
def act() {
loop {
react {
case msg => {
println((sender.##).toInt + ": " + msg)
}
}
}
}
}

object Main {
def main(args: Array[String]) = {
Logger.start()

for(i <- 0 to 2) {
actor {
for(j <- 0 to 5) {
Logger ! "Message" + j
}
}
}

sleep(1000)
}
}

実行結果:

31063377: Message0
32887686: Message0
32358515: Message0
31063377: Message1
31063377: Message2
31063377: Message3
31063377: Message4
31063377: Message5
32358515: Message1
32358515: Message2
32358515: Message3
32358515: Message4
32358515: Message5
32887686: Message1
32887686: Message2
32887686: Message3
32887686: Message4
32887686: Message5