第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

你可能感兴趣的:(scala)