package test.scala.lang.actor import scala.actors.Actor import scala.actors.Exit object TestActorLink { def main(args: Array[String]): Unit = { //testReact testLink } def testLink = { val master = new MActor master.start() val slave = new SActor(master) slave.start() Thread.sleep(3000) master ! "test" master ! 4 master ! "test" slave ! "test" slave ! 4 slave ! "test" } def testReact = { val t = new TActor t.start() Thread.sleep(3000) t ! 4 t ! "test" } } class MActor extends Actor { def act() { println("master actor start...") loop { react({ case x: String => { println("MActor: " + x) println("MActor: goodbye guys") exit("game over, haha!") //非Normal原因终止 //exit //Normal原因终止 } case o => println(o) }) } } } /** * Terminates execution of self with the following effect on linked actors: * For each linked actor a with trapExit set to true, send message Exit(self, reason) to a. * For each linked actor a with trapExit set to false (default), call a.exit(reason) if reason != 'normal. */ class SActor(master: Actor) extends Actor { def act(){ println("slave actor start...") trapExit = true link(master)//当前Actor链接到的Actor如果以非Normal原因终止,则该Actor也终止。 loop { react({ case Exit(master, reason) => { println(s"---[$master] game over by [$reason]---") println(s"SActor say: why are you so diao, [$master] ?") exit } case x => { println("SActor say: " + x) } }) } } } class TActor extends Actor { def act() { println("act start...") while (true) { react({ case x: String => println(x) }) } } }
http://booksites.artima.com/actors_in_scala/examples/html/ch06.html#sec2