scala实现actor间同步和异步的信息传输
package actor_testimport scala.actors.Actorimport scala.actors.Actor._// define a messageclass FromXX(msg:String, idx:Int) {val msg_ = msgval idx_ = idx}object Stopclass XX(var count: Int, yy: Actor) extends Actor { def act() { for (idx <- 0 to count) { val tmp = new FromXX("MSG " + idx + " FROM XX", idx) //yy !? tmp // synchronous yy ! tmp // asynchronous Console.println("MSG " + idx + " SENT") } Console.println("XX HAS STOP SEND MSG TO YY!") yy ! Stop }}class YY extends Actor { def act() { while (true) { receive { case t:FromXX => Console.println("YY RECEIVE: " + t.msg_) sender ! 0 case Stop => Console.println("YY RECEIVE STOP ORDRE!") exit() } } }}object test extends Application { val yy = new YY val xx = new XX(3, yy) xx.start yy.start}
?
异步运行结果:
?
?
MSG 0 SENT
YY RECEIVE: MSG 0 FROM XX
YY RECEIVE: MSG 1 FROM XX
MSG 1 SENT
MSG 2 SENT
YY RECEIVE: MSG 2 FROM XX
MSG 3 SENT
YY RECEIVE: MSG 3 FROM XX
XX HAS STOP SEND MSG TO YY!
YY RECEIVE STOP ORDRE!
?
同步运行结果:
?
YY RECEIVE: MSG 0 FROM XX
MSG 0 SENT
YY RECEIVE: MSG 1 FROM XX
MSG 1 SENT
YY RECEIVE: MSG 2 FROM XX
MSG 2 SENT
YY RECEIVE: MSG 3 FROM XX
MSG 3 SENT
XX HAS STOP SEND MSG TO YY!
YY RECEIVE STOP ORDRE!
?
我们也可以看到actor的一些特性,
例如actor A发给actor B的消息,B必须是按顺序收到的。
参考
http://www.scala-lang.org/node/242
http://docs.scala-lang.org/overviews/core/actors.html
?