Scala学习笔记(三)Actor简单例子
2012-02-11 14:45
393 查看
在了解了Scala的一些基本特性之后,看到了它的线程实现:Actor。笔者不知道这么叫是否合适,因为Actor的目的似乎专注于在实体之间使用消息传递来协作。翻了一下它的原型定义如下:
从这个版本的源码(<=Scala 2.7)中可以看出,Actor除了代表线程类之外还引入了MailBox,本来我们都知道继承java.lang.Thread只会要求重写run()方法,不会有别的改变,Scala使用act()来代替了使用run()的习惯,由于混入了MailBox使得Scala的Actor具有了receive和receiveWith等新的方法,从而完成消息传递的协作。(但笔者最近在新的Scala版本中发现这一切都有了重大改变,Actor不再混入MailBox,整个Actor只包含了伴生对象object
Actor和抽象接口trait Actor的定义,看起来线程实现的角色更加简洁明了。receive和receiveWithIn被同时直接加入为伴生对象Actor和trait Actor中。)
这里不深入讨论Actor的特点,先通过一个小例子,来看Actor是如何工作的:
这是一个拍卖通信的例子,在while循环里Auction能分辨请求消息的种类然后做合适的处理,当发生超时事件,开始进行整个结束流程。
abstract class Actor extends Thread with MailBox{ def act() : Unit override def run(): Unit = act() def !(msg: Any) = send(msg) }
从这个版本的源码(<=Scala 2.7)中可以看出,Actor除了代表线程类之外还引入了MailBox,本来我们都知道继承java.lang.Thread只会要求重写run()方法,不会有别的改变,Scala使用act()来代替了使用run()的习惯,由于混入了MailBox使得Scala的Actor具有了receive和receiveWith等新的方法,从而完成消息传递的协作。(但笔者最近在新的Scala版本中发现这一切都有了重大改变,Actor不再混入MailBox,整个Actor只包含了伴生对象object
Actor和抽象接口trait Actor的定义,看起来线程实现的角色更加简洁明了。receive和receiveWithIn被同时直接加入为伴生对象Actor和trait Actor中。)
这里不深入讨论Actor的特点,先通过一个小例子,来看Actor是如何工作的:
import scala.actors.Actor, java.util._ abstract class AuctionMessage case class Offer(bid: Int, client: Actor) extends AuctionMessage case class Inquire(client: Actor) extends AuctionMessage case object TIMEOUT abstract class AuctionReply case class Status(asked: Int, expire: Date) extends AuctionReply case object BestOffer extends AuctionReply case class BeatenOffer(maxBid: Int) extends AuctionReply case class AuctionConcluded(seller: Actor, client: Actor) extends AuctionReply case object AuctionFailed extends AuctionReply case object AuctionOver extends AuctionReply /** * Before finally stopping, it stays active for another period determined by the * timeToShutdown constant and replies to further offers that the auction is closed **/ class Auction (seller: Actor, minBid: Int, closing: Date) extends Actor{ // 60 minutes to shut down the auction val timeToShutdown = 3600000 // minimum bid for each offer val bidIncrement = 10 def act(){ var maxBid = minBid - bidIncrement var maxBidder: Actor = null var running = true while(running){ //receiveWithin: just span a period of time for mailbox messages then stopped receiveWithin ((closing.getTime() - new Date().getTime())){ case Offer(bid, client) => if(bid >= maxBid + bidIncrement){ //beat successfully, notify the current maxBidder, then replace it if(maxBid >= minBid) maxBidder ! BeatenOffer(bid) //reply to client the current offer peak value maxBid = bid; maxBidder = client; client ! BestOffer }else{ //beat failed, return the current max bid value to offer client client ! BeatenOffer(maxBid) } case Inquire(client) => // query the max bid and closing time client ! Status(maxBid, closing) case TIMEOUT => //auction done if(maxBid >= minBid){ val reply = AuctionConcluded(seller, maxBidder) maxBidder ! reply; seller ! reply }else{ //no one get the auction, notify seller seller ! AuctionFailed } //for further offer message, tell them over receiveWithin(timeToShutdown){ case Offer(_, client) => client ! AuctionOver case TIMEOUT => running = false } } } } }
这是一个拍卖通信的例子,在while循环里Auction能分辨请求消息的种类然后做合适的处理,当发生超时事件,开始进行整个结束流程。
相关文章推荐
- OpenGL学习笔记 (1) —— 在VS2008下的两个简单例子
- JS学习笔记 - 一个简单例子
- 学习笔记Java applet简单例子
- IOS开发学习笔记(二)——简单小例子
- Scala学习笔记7 (actor)
- Spark学习笔记 --- scala实现Spark wordcount例子
- Scala学习笔记-环境搭建以及简单语法
- Quartz2.2.1 学习笔记(一)简单例子
- 【FacebookSDK学习笔记】Facebook官方Demo例子简单分析
- 【Unity 3D】学习笔记29:游戏的例子——简单的小制作地图
- Java-马士兵设计模式学习笔记-观察者模式-AWT简单例子
- JasperReport学习笔记2-创建简单的报表例子
- Scala学习笔记--Actor和并发
- scala学习笔记5 spark-shell的简单操作
- hadoop学习笔记3.通过电话通信清单例子简单使用Reduce和打包JAR
- Scala学习笔记7 (actor)
- Scala 学习笔记(4)-集合类简单操作
- c#学习笔记之九 事件(event)的使用,一个简单的例子揭示其设计理念
- Scala 学习笔记(6)-程序例子Scala Keams聚类算法
- gtk学习笔记之简单例子