scala.concurrent.ops を使ったサンプル例
並行処理(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)