大数据系列修炼-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 class与case 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
- 大数据系列修炼-Scala课程68
- 大数据系列修炼-Scala课程01
- 大数据系列修炼-Scala课程02
- 大数据系列修炼-Scala课程03
- 大数据系列修炼-Scala课程04
- 大数据系列修炼-Scala课程05
- 大数据系列修炼-Scala课程06
- 大数据系列修炼-Scala课程07
- 大数据系列修炼-Scala课程08
- 大数据系列修炼-Scala课程09
- 大数据系列修炼-Scala课程10
- 大数据系列修炼-Scala课程11
- 大数据系列修炼-Scala课程12
- 大数据系列修炼-Scala课程15
- 大数据系列修炼-Scala课程17
- 大数据系列修炼-Scala课程18
- 大数据系列修炼-Scala课程19
- 大数据系列修炼-Scala课程20
- 八皇后问题(递归)
- C# 创建和写入文件
- Penetration testing checklist based on OWASP Top 10 Mobile
- 链表反转算法
- eclipse查看jar包源代码乱码问题解决
- 大数据系列修炼-Scala课程68
- C++学习笔记--对象创建
- hdu 2098 素数打表
- Android 微信分享与QQ分享功能
- 代理模式
- sizeof与strlen用法详解(结构体对齐)
- 【C/C++】BOOST 线程完全攻略 - 基础篇
- socket编程接口介绍
- 原型模式(Prototype)