上一节我们讲了,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})
}
}
参考文档
百度网盘:http://pan.baidu.com/share/home?uk=4013289088#category/type=0
微信号:18610086859
DT大数据微信公众账号:DT_Spark
DT大数据梦工厂交流群:462923555/418110145/437123764