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
原创粉丝点击