第69講 scala併發程式設計 react 、loop 程式設計
阿新 • • 發佈:2018-12-25
上一節我們講了,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})
}
}