王家林系列之scala--第69讲:Scala并发编程react、loop代码实战详解

时间:2023-12-15 18:51:08

刚才看了一下,群里王家林老师又更新课程了,真为王老师的勤奋感到佩服,于是迫不及待的下载下来观看学习。本期讲的是关于scala并发编程的react、loop代码实战。

信息来源于 DT大数据梦工厂微信公众账号:DT_Spark

关注微信账号,获取更多关于王家林老师的课程内容

王家林亲授《DT大数据梦工厂》大数据实战视频“Scala深入浅出实战经典”视频、音频和PPT下载!

百度云盘:http://pan.baidu.com/s/1c0noOt6
腾讯微云:http://url.cn/TnGbdC
360云盘:http://yunpan.cn/cQ4c2UALDjSKy   访问密码 45e2

OK,按照老规矩,让我们从代码出发:

object NameResolver extends Actor{
  def act(){
    react{
      case Net(name,actor) =>
        actor ! getIp(name)
        act
      case "EXIT" =>println("Name resolver exiting.")
      case msg =>
        println("unhandled message : " + msg)
        act
    }
  }

//    loop{
//    react{
//      case Net(name,actor)=>
//        actor ! getIp(name)
//       
//      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.reactWithin(1000){case x =>x})
   
  }
}

我们一看NameResolver的定义。在本Actor定义的时候,我们没有用receive的方式,而是用的react方法,这样做的好处是,下一个actor可以重用当前actor所在的线程,达到线程重用的效果。

那我们的scala代码库为了简化代码,提供了loop方法,可以简化react方法的调用。