您的位置:首页 > Web前端 > React

第69讲 scala并发编程 react 、loop 编程

2015-07-28 22:03 507 查看
上一节我们讲了,actor的receive 偏函数,它属于 每请求没线程模式,用完了就销毁。 有没有线程共享,请看本文。

scala 为了提升性能,有2种共享线程方式,一种是使用react ,另一种是 loop方法。

一、 react 方式

代码如下:

def act(): Unit ={
 react{
    case NameToIp(name,actor)=>
      println(name+":"+getIp(name))
      actor ! "successfully done"
      act // 为了不销毁线程,反复调用act方法
    case msg =>
      println(msg)
      act  // 为了不销毁线程,反复调用act方法
    case _=>
      println("nothing else ...")
      act  // 为了不销毁线程,反复调用act方法
    }
  }


通过与上一节比较,主要通过react方法来替代receive方法进行消息的处理,为了控制线程退出,需要反复调用act方法。为了简化,请看loop方式

二、 loop 方式

代码如下:

def act(): Unit ={
 loop {
    react{
      case NameToIp(name,actor)=>
        println(name+":"+getIp(name))
        actor ! "successfull done"
      case msg =>
        println(msg)
      }
  }
}


为了不递归调用act方法,scala 提供了 loop 函数。

最终代码如下

import scala.actors.Actor
import scala.actors.Actor._
import java.net.InetAddress
import java.net.UnknownHostExeption

object NameResolver extends Actor{

def act(){
loop {
react {
case Net (name, actor) =>
sender ! getIp(name)
act
case msg =>
println("Unhandled message : " + msg)
}
}
}
def getIp(name : String) : Option[InetAddress] = {
try{
println(InetAddress.getByName(name))
Some(InetAddress.getByName(name))
} catch {
case _ : UnknownHostException => None
}
}
}

case class Net(name : String, actor: Actor)

object Actor_More_effective {

def main(args: Array[String]) {
NameResolver.start
NameResolver ! Net("www.baidu.com", self)
println(self.receiveWithin(1000){case x => x})
}
}


参考文档

百度网盘:http://pan.baidu.com/share/home?uk=4013289088#category/type=0

微信号:18610086859

DT大数据微信公众账号:DT_Spark

DT大数据梦工厂交流群:462923555/418110145/437123764
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: