標籤:
Scala並發編程react、loop代碼實戰解析,內容介紹和視頻連結:http://pan.baidu.com/s/1bnlpuVH,歡迎下載視頻
內容介紹:Scala並發編程中共用線程的使用
(1)在Actor類的act方法中,可以使用react方法來替代receive方法進行訊息的處理,使用react方法的好處是可以在一個線程中執行多個Actor的訊息處理函數,需要注意的是當react方法接受到的訊息匹配到它方法體中的一個偏函數時並進行訊息的處理後會導致該react方法的退出,這時一般常常在react方法中每個偏函數的最後一行加上 act()方法 使得react方法可以重新關聯Actor的郵箱。
(2)由於讓訊息處理器中的每個偏函數末行加上一個 act()方法 來負責保持迴圈繼續下去是一件很麻煩且很不公平的事情,Scala語言提供了loop組合子來簡化這個問題,在Actor的act()方法和react方法之間使用loop組合子可以產生一個無限的迴圈,如果想給迴圈加上一個條件,可以把loop換成loopWhile,然後在其後面加上條件判斷語句。
實戰代碼:
object NameResolver extends Actor{
def act(){
//用react方法來替代receive方法進行訊息的處理,react允許共用線程資料,react方法匹配一次並執行完成,然後會退出, 通過再次調用act()方法來重新關聯Actor的郵箱。
react{
case NameToIp(name,actor)=>
println(name+":"+getIp(name))
actor ! "successfully done"
act //通過調用繼續處理郵箱資訊
case msg =>
println(msg)
act
case _=>
println("nothing else ...")
act
}
/*
//loop可以迴圈調用react來處理郵箱的資訊
loop {
react{
case NameToIp(name,actor)=>
println(name+":"+getIp(name))
actor ! "successfully done"
case msg =>
println(msg)
}
}
}
def getIp(siteName:String): Option[InetAddress] ={
try{
println(InetAddress.getByName(siteName))
Some(InetAddress.getByName(siteName))
}catch{
case _ : UnknownHostException =>None } } }
case class NameToIp(name:String,actor:Actor)
object ActorTest3 {
def main(args:Array[String]){
NameResolver.start()
NameResolver ! NameToIp("www.baidu.com",self)
self.receive{
case msg=> println(msg)
case _ => println("nothing")
}
NameResolver ! "test"
} }
重磅!王家林親授《DT大資料夢工廠》大資料實戰視頻“Scala深入淺出實戰(1-69講)”全部視頻、音頻、代碼和PPT:
百度網盤:http://pan.baidu.com/share/home?uk=4013289088#category/type=0&qq-pf-to=pcqq.group,歡迎分享
Scala並發編程react、loop代碼實戰解析