actor是scala一个比较好用的库,使并发编程更加便捷。
package actor_test
import scala.actors.Actor
import scala.actors.Actor._
// define a message
class FromXX(msg:String, idx:Int) {
val msg_ = msg
val idx_ = idx
}
object Stop
class 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