Programming in Scala ch30 (Actor..
时间:2010-09-27 来源:jamesqiu
scala> self ! "hello"
scala> self.receive { case x => x }
res9: Any = hello
30.4 线程复用以提高性能(P613)
由于react方法不需要返回,其实现就无需保存当前线程的调用栈,所以当前线程可以被下一个唤醒的actor所使用。该方法很高效,如果程序中所有actor都使用react方法而不是receive方法,只需一个线程就可以处理程序所有的actor(如果计算机是多核CPU,actor就会生成足够多的线程以充分利用CPU所有的核)。
import actors._, actors.Actor._, java.net._
object NameResolver extends Actor { // 得到域名对应的ip
def act() {
react {
case (name: String, actor: Actor) => actor ! getIp(name); act()
case "EXIT" => println("Name resolver exiting.")
case msg => println("Unhandled message: " + msg); act()
}
}
def getIp(name: String): Option[InetAddress] = {
try { Some(InetAddress.getByName(name))
} catch { case _: UnknownHostException => None }
}
}
scala> self.receiveWithin(0) { case x => x }
res3: Any = Some(www.scala-lang.org/128.178.154.159)
scala> NameResolver ! ("wwwwww.scala-lang.org", self)
scala> self.receiveWithin(0) { case x => x }
res5: Any = None
def act() {
loop {
react {
case (name: String, actor: Actor) => actor ! getIp(name)
case msg => println("Unhandled message: " + msg)
}
}