MailBox
MailBoxは、複数スレッド間での同期制御とメッセージの送受信をさくっとできるようにするユーティリティクラスです。
- 要は、Javaにおけるjava.util.concurrent.BlockingQueueです。メッセージ送付側はブロックしないようなので、容量制限のないjava.util.concurrent.LinkedBlockingQueueがたぶん近い。
- RubyだとQueueですな。
使い方は次のような感じ。
import scala.concurrent._ import scala.concurrent.ops._ object MailBoxSample { // メッセージとしてやりとりするクラス private case class Value(i:Int) private case class End def main(args: Array[String]) { // メールボックス val m = new MailBox // メールボックスへのメッセージの送付を待ち受けるスレッド spawn { var loop = true while( loop ) { // receiveでメールボックスにメッセージが送付されるのを待つ。 val msg = m.receive( x => x match { case Value(i:Int) => i // Valueがメッセージで送付された場合、値を取り出して復帰 case End => null // Endが送付された場合、nullを返す }) // メッセージを処理 if ( msg == null ) loop = false // nullの場合ループを終了。 else println( msg ) } println( "end." ) } // メールボックスにメッセージを送るスレッド spawn { 0 to 10 foreach( i=> m send Value(i) ) // 1から10までを順に送付し、 m send End // 最後にEndを送る。 } } }
実行結果です。
0 1 2 3 4 5 6 7 8 9 10 end.