大数据系列修炼-Scala课程68

来源:互联网 发布:微博用户数据 编辑:程序博客网 时间:2024/05/17 22:53

大数据系列修炼-Scala课程68


核心内容:
1、Scala中的原生线程Actor、基于Actor的Case class的消息传递和Actor模型认知以及相应的优化方式


1、Scala中的原生线程Actor、基于Actor的Case class的消息传递和Actor模型认知

1、Scala的原生线程(即主线程)可以看做是一个Actor,当它需要接受并处理消息的时候,直接调用Actor伴生对象的self方法
返回一个Actor实例对象,然后通过Actor实例对象的receive偏函数进行消息的模式匹配并进行处理
2、Scala中的case class与case object有两种功能:消息传递与模式匹配。在声明case class的过程中,若在扩展的属性前面没有加修饰符var与val,默认的修饰符为val,意味着在消息传递的过程中的属性是不可变的,因此特别适合消息传递.
这里写图片描述
3、在Actor的实现过程中,不要太依赖于消息传递的顺序,因为消息具体是什么时候送达我们的邮箱是不确定的。
4、为了避免Actor接受到的消息无法匹配到receive偏函数中的case备选项,进而导致Actor的邮箱被一些无关的信息占满,一般情况下,我们会在receive偏函数中加一个case _备选项,使得receive方法可以处理掉邮箱中收到的所有消息,进而避免邮箱被无关的消息占满。
5、不同Actor之间可以进行消息通信,Spark不同组件之间的通信大部分都是通过Akka的方式,而Akka是基于Scala中的Actor。
6、用户无需关心Actor和底层线程之间的关系,只需要基于Actor编写消息驱动的代码


实例程序1:

case class B(name:String,age:Int)  //scala中常用case classcase object进行消息的传递class A extends Actor{    def act()=    {        while(true)        {           receive   //内部执行是线性的,不存在资源争用           {             case msg:String => println(msg)             sender.!("消息以收到!")  //回复主线程消息已经收到!             //提取出case class的内容信息!             case B(name,age) => println("name is:"+name+"age is:"+age)             sender.!("case class的消息已经提取!")             //receive中长增加case _处理项目,进而避免邮箱被无关的消息占满             case _ => println("Nothing!")             sender.!("消息无用!")           }        }    }}object App1 {   def main(args:Array[String]):Unit=   {      val aa = new A()      aa.start() //开辟线程      aa.!("hello Spark!") //向其它线程发送一个消息      Actor.self.receive{ case msg  => println(msg)}      println("------------------")      aa ! B("Spark",100)  //向子线程发送一个case class      Actor.self.receive{ case msg  => println("哈哈:" + msg)}         println("------------------")      aa ! 20      Actor.self.receive{ case msg => println("没有!")}   }}

运行结果:

hello Spark!消息以收到!------------------name is:Sparkage is:100哈哈:case class的消息已经提取!------------------Nothing!没有!

如有问题,欢迎留言!

0 0
原创粉丝点击