スレッドを直接終了させた場合、クリティカルセクション中の場合問題が出る。
そこで、スレッドを直接終了させるのではなく、
スレッドに終了するように命令して、スレッドがそれを受け取るとスレッドが自分自身で終了する。
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 Stopobject 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を終了させられない。
溜まっているメッセージより優先させて終了させる方法はないのかな・・?