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

上一节我们讲了,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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值