标签:
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,欢迎分享
标签:
原文地址:http://www.cnblogs.com/lercy81/p/4679334.html