1. 程式人生 > >第69講 scala併發程式設計 react 、loop 程式設計

第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}) } }