Scala学习 -------- Actor实战

版权声明:个人原创,转载请标注! https://blog.csdn.net/Z_Date/article/details/84521425

第一个例子(while-receive不断地接收消息)

package com.zzk1

import scala.actors.{Actor, Future}

//Atl+Enter导包
//Ctrl+i 实现抽象方法
class ActorDemo extends Actor{
    //接受消息的方法
    override def act(): Unit = {
        //无限循环
        while(true){
          //处理方式,匹配模式。匹配消息,消息匹配成功,执行该分支的代码
          receive{
              case "start" =>{
                println("收到一个start消息")
                 //返回一个消息
                 sender ! "rec"
              }
              case "stop" =>{println("收到一个stop消息")}
          }
       }
  }
}
//给自己发送同步消息
for(i <- 1 to 10){
  actor ! "stop"
}
//注意:使用异步发送,如果使用!?同步发送会阻塞当前线程

2.2. 第二个例子(loop-react不断地接收消息)

package com.zzk1

import scala.actors.{Actor, Future}

//Atl+Enter导包
//Ctrl+i 实现抽象方法
class ActorDemo extends Actor{
    //接受消息的方法
    override def act(): Unit = {
        //无限循环
        loop{
          //处理方式,匹配模式。匹配消息,消息匹配成功,执行该分支的代码
          react{
              case "start" =>{
                println("收到一个start消息")
                 //返回一个消息
                 sender ! "rec"
              }
              case "stop" =>{println("收到一个stop消息")}
          }
       }
  }
}

推荐:使用loop - react语法,编写

2.3. 第三个例子(结合case class发送消息,Msg消息分类案例)

package com.zzk2

import scala.actors.Actor

//样例类
class Msg
case class ADMsg(msgType:String,msgContent:String) extends Msg
case class MyMsg(msgType:String,msgContent:String) extends Msg


class ActorDemo2 extends Actor{
  override def act(): Unit = {
    receive{
      case ADMsg(msgType,msgContent) =>{
        print(s"消息类型: $msgType,消息内容:$msgContent")
      }
      case MyMsg(msgType,msgContent) =>{
        print(s"消息类型: $msgType,消息内容:$msgContent")
      }
    }
  }
}

object Test{

  def main(args: Array[String]): Unit = {
    //创建Actor
    val actor=new ActorDemo2
    //启动
    actor.start()
    //发送消息
    val admsg=new ADMsg("广告","你有一张传票,在朝阳区法院,请拨打电话12345,咨询!")
    val mymsg=new MyMsg("正常","有钱吗?来点!")

    //发送消息
    //actor ! admsg
    actor ! mymsg
    
  }
}

2.4. 练习(并发版WordCount)

思路:1、将数据文件路径放入集合,利用循环进行任务分发

2、所有actor结果封装自己的map返回,然后统一放入总map

package com.zzk3

import java.io.File

import scala.actors.{Actor, Future}
import scala.collection.mutable
import scala.io.{BufferedSource, Source}


class ActorDemo3 extends Actor{
  override def act(): Unit = {
    receive{
      case x:File=>{
        //Source读取文件
        val source: BufferedSource = Source.fromFile(x)
        //WordCount
        val strings: Iterator[String] = source.getLines()
        val m1:Map[String,Int]=strings.toList.flatMap((x)=>{x.split("\\s+")})
        .map((x)=>{(x,1)}).groupBy((x)=>{x._1})
        .map((x)=>{(x._1,x._2.size)});
        //发送消息回去
        sender ! m1
      }
    }
  }
}

object Test{
  def main(args: Array[String]): Unit = {
    //存放文件路径
    val list=List("D://shuju/a.txt","D://shuju/b.txt","D://shuju/c.txt")
    //创建一个存放actor返回结果的容器
    val map=new mutable.HashMap[String,Map[String,Int]]()

    //使用循环遍历集合,读出path
    for(path <- list){
      //读出路径,获取文件
      val file=new File(path.toString)
      //将文件发送(!!)给Actor处理,每个Actor会返回一个处理结果
      val actor=new ActorDemo3
      actor.start()
      val value: Future[Any] = actor !! file
      //将收到的结果放入Map容器,后续处理
      map.put(path,value.apply().asInstanceOf[Map[String,Int]])
    }

    //将map中的数据输出
    for((k,v)<-map){
      //迭代v
      for((k1,v1)<-v){
        //输出数据
        println("--->路径:"+k+"  map:("+k1+":"+v1+")")
      }
    }
    
  }
}

猜你喜欢

转载自blog.csdn.net/Z_Date/article/details/84521425