`
splayx
  • 浏览: 82803 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

scala实现actor间同步和异步的信息传输

 
阅读更多

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics