版权声明:个人原创,转载请标注! 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+")")
}
}
}
}