seratch's weblog in Japanese

About Scala, Java and Ruby programming in Japaense. If you need English information, go to http://blog.seratch.net/

scala.concurrent.ops を使ったサンプル例

Scalaのバージョン

この記事が対象とするScalaのバージョンは「2.9.1.final」です。

並行処理(spawn)

spawn{ } の中はその場限りの別スレッドで処理されます。

import scala.concurrent.ops._
spawn {
  Thread.sleep(3000L)
  println("by spawn")
}
Thread.sleep(2000L)
println("Maybe before spawn...")
Thread.sleep(2000L)

// Maybe before spawn...
// by spawn

上記の例だと構文っぽく見えますが、spawn は ops という Singleton オブジェクトに定義されているメソッド(引数は名前渡しの「=>Unit」)で、メソッド呼び出しっぽく書くと以下のようになります。

import concurrent.ops
ops.spawn({
  println("do something")
})

変数は値コピーではなく参照されるので、特に mutable な変数の共有は注意が必要です。

import concurrent.ops._
var hoge = "hoge" // mutableな変数
spawn {
  Thread.sleep(500L)
  println(hoge) // hoge
}
spawn {
  Thread.sleep(1000L)
  println(hoge) // HOGE
}
spawn {
  Thread.sleep(2000L)
  println(hoge) // HOGE
}
Thread.sleep(800L)
hoge = "HOGE"
Thread.sleep(2000L)

二つの処理を並行で実行する(par)

par[A,B](xp: => A, yp: => B): (A, B) は名前渡しで渡された二つの処理を並行で実行し、結果をタプルで返します。

import concurrent.ops._
val result: (String, Int) = par ({ Thread.sleep(1000L); "1" },  { Thread.sleep(2000L); 2 })

並行処理の待ち合わせ(future)

future{ } の中の処理結果を Future として受け取れます。apply で結果を取得する時は同期処理になります。

import scala.concurrent.ops._
val ftime = future {
  Thread.sleep(3000L)
  System.currentTimeMillis
}
val time = System.currentTimeMillis
assert(time < ftime()) // assert(time < ftime.apply)