标签:
王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典”视频、音频和PPT下载!第69讲:Scala并发编程react、loop代码实战详解
百度云:http://pan.baidu.com/s/1pJtEubL
腾讯微云:http://url.cn/eqMJ9T
360云盘:http://yunpan.cn/cc9PJQBpuPHk6 访问密码 18cc
本节王老师讲了共享线程的react,和方便写代码的loop方式。
正常如果我们用receive来接收消息,必须要重新建一个线程,而用react来接收,就会重用已经存在的线程。因为这个react是放在一个object中的,这个object继承Actor。并且react不需要返回值,所以也就不需要保留当前线程的堆栈,所以可以重用线程。
object NameResolver extends Actor{
def act(){
react{
case Net(name,actor)=>//这里Net引用了一个actor参数
sender ! getIp(name)
act//因为react没有返回,所以还要再执行一次act,来让其执行receive的工作。
case "Exit"=>println("Name resolver exiting.")
case msg=>println("Unhandled nessage: "+msg)
act
}
}
loop{
react{
case Net(name,actor)=>//这里Net引用了一个actor参数.但是没有再次调用act简化了代码
sender ! getIp(name)
case "Exit"=>println("Name resolver exiting.")
case msg=>println("Unhandled nessage: "+msg)
}
}
def getIp(name:String):Option[InetAddress]={//获取ip地址
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)发送的是在actor的同一个线程中运行
println(self.receiveWithin(1000){case x=>x})
}
}
标签:
原文地址:http://www.cnblogs.com/trgaaaaa/p/4677660.html