なんじゃくにっき

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

Scala de Design Pattern: Two-Phase Termination

 スレッドを直接終了させた場合、クリティカルセクション中の場合問題が出る。
そこで、スレッドを直接終了させるのではなく、
スレッドに終了するように命令して、スレッドがそれを受け取るとスレッドが自分自身で終了する。
 
 JavaでもThread#stop はdeprecated。
Javaの場合はinterruptで割り込んで終了させたりする。
 
 Scalaの場合、1Actorが1Threadに対応しているわけではないので、
ActorからThreadを取得してinterrupt、という方法では上手くActorを終了させることができない。
Actorを終了させるときは終了メッセージをMailBox経由で送って終了させる。
 
例:

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

case class Start
case class Stop

object TwoPhaseTerminationExample extends Actor {
def act() = {
loop {
react {
case Stop => {
println("終了")
exit()
}
case msg => println(msg)
}
}
}
}

object Main {
def main(args: Array[String]) = {
TwoPhaseTerminationExample.start()
TwoPhaseTerminationExample ! "A"
TwoPhaseTerminationExample ! "B"
TwoPhaseTerminationExample ! "C"
TwoPhaseTerminationExample ! Stop
}
}

 
 この例だとMailBoxに前のメッセージが溜まっている限りはActorを終了させられない。
溜まっているメッセージより優先させて終了させる方法はないのかな・・?