scala学习笔记3-Actor、case class和object、loop和react的使用
来源:互联网 发布:cms建站系统 java 编辑:程序博客网 时间:2024/04/29 21:56
一、Scala并发编程初体验
a) 关键类Actor:java的并发模型是共享数据+加锁机制,java.util.concurrent包提供的并发依然采用该机制,当系统异常复杂有很多线程存在资源抢占的问题。而scala提供的Actor,可以应对高并发,是基于消息传递的。Akka是基于scala的actor实现的并发框架,在spark的结点通信中得到广泛应用。
b) 简单的实例代码:
import scala.actors.Actor object HelloActor { def main(args: Array[String]): Unit = { FirstActor.start() SecondActor.start() } } object FirstActor extends Actor { override def act() { for(i <- 1.to(5)) { println("step1 " + i) Thread.sleep(1000) } } } object SecondActor extends Actor { override def act() { for(i <- 1.to(5)) { println("step2 " + i) Thread.sleep(1000) } } }
二、Scala匿名actor类、消息传递和偏函数
import scala.actors.Actor._ //注意这两个包import scala.actors.Actor object MyActor extends Actor { override defact() = { while(true) { receive { case msg : Double => println("myactor double, msg = " + msg) case _ => println("myactorunknow") } } } } object ActorMessages { def main(args:Array[String]): Unit = { val messageActor = actor {//匿名actor while(true){ //消息传递,如果actor邮箱有消息,则立即执行,否则进入阻塞 receive { //isDefinedAtapply //首先通过isDefinedAt判断receive是否定义了对应类型消息的处理方法,没有则忽略;存在的话则调用apply,通过偏函数对具体类型的消息进行处理 case msg : String => { println("string, msg = "+ msg) } case msg : Double => println("double, msg = " + msg) case _=> println("unknow") } } } //向actor的邮箱中发送消息 messageActor ! "hadoop" messageActor! Math.PI messageActor! 0 MyActor.start() MyActor !"spark" } }
三、 Scala原生Actor、case class/object消息类型传递
a) 发送者向actor邮箱发送消息,类型为case class/object,提取其中的参数b) Actor接收消息处理后,通过sender ! 反馈消息给发送者
c) 发送者通过self.receive / reveiveWithIn来接收actor发来的消息
import scala.actors.Actor /** * caseclass/object 类型的消息传递 */ case class Person(name : String, age : Int) class PersonActor extends Actor {//原生actor override defact() = { while(true) { receive { case Person(name, age)=> {//匹配到case class person println("receive person, age =" + age + ", name = " + name) sender ! "copy that!" //向发送者返回消息 } case _=> //TODO 需要有一个默认的接收,否则actor邮箱中会出现堆满消息的可能,得不到处理 } } } } object ActorWithCaseClass { def main(args :Array[String]) = { val pa = new PersonActor pa.start() pa ! new Person("java", 16) //main向pa发送一个消息 self.receive {//main接收pa返回的消息,保持阻塞 case msg : String => println(msg) } self.receiveWithin(1000) {//1000ms之后,超时 case msg : String => println(msg) } }}
四、Scala中loop和react的使用
将三中的act()中的while(true)部分重写:
loop {//重复利用线程 react {//react偏函数 case Person(name, age) => {//匹配到case class person println("receive person, age =" + age + ", name = " + name) sender ! "copy that!" //向发送者返回消息 } case _=> //TODO 需要有一个默认的接收,否则actor邮箱中会出现堆满消息的可能,得不到处理 } }
0 0
- scala学习笔记3-Actor、case class和object、loop和react的使用
- scala之case class 和case object
- Scala Actor,receive不断接收消息,react复用线程,结合case class的actor,Future使用,使用Actor进行wordCount
- scala并发编程原生线程Actor、Case Class下的消息传递和偏函数实战
- scala-29:Case class和Case object代码实战解析
- Scala学习笔记11 - Actor和并发
- Scala class和case class的区别
- Scala class和case class的区别
- Scala class和case class的区别
- Scala class和case class的区别
- scala的模式匹配和case class
- scala学习笔记08--Option和case
- scala学习笔记08--Option和case
- Scala的object和class的区别
- Scala模式匹配,case 字符串,case 匹配类型,case 匹配数组,case 匹配List,case 匹配元组,case匹配case class和case object
- Scala 并发编程之react和loop
- scala中 object 和 class的区别
- scala class和object的区别
- iOS弹框建立方式新旧对比
- handler使用
- 数据结构 二叉树的递归算法、前序、中序、后序遍历(c语言实现)
- 键盘问题导致BIOS自检失败
- HDU-1520 Anniversary party(树形DP)
- scala学习笔记3-Actor、case class和object、loop和react的使用
- 如何实现讯飞语音录入和输出与图灵机器人结合
- Qt之Tab键切换焦点顺序
- Apache HttpClient4.5(一)
- GNU内联汇编之占位符的使用
- c++动态创建二维数组
- HDOJ--2031
- 如何用js完美的解析lrc歌词
- bzoj3550【ONTAK2010】Vacation