scala 用actor并发统计词频



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

case class MySend(file: String)

case class MyRecieve(msg: Map[String, Int])

case class Terminate(msg: String)

class Task extends Actor {
override def act(): Unit = {
loop {
react {
case MySend(file) => {//接收文件
val msg = Source.fromFile(file).getLines().flatMap(_.split(" ")).map((_, 1)).toList.groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2))
sender ! MyRecieve(msg) //返回执行结果
}
case Terminate(msg) => {
sys.exit(1)
}
}
}
}
}



object TaskMain extends App {
val files = Set("G:\\1.txt", "G:\\2.txt")
val resSet = mutable.HashSet[Future[Any]]()
//起两个actor,发送异步消息,返回Future
for (file <- files) {
val res = new Task().start() !! MySend(file)
resSet += res
}

val lbf = new mutable.ListBuffer[Map[String, Int]]()
//等待计算结果,计算全部完成时推出循环
while (resSet.size != 0) {
for (elem <- resSet) {
if (elem.isSet) {//判断任务是否执行完
lbf += elem.apply().asInstanceOf[MyRecieve].msg //任务执行完成,通过apply方法获取执行结果(由sender发送过来)
resSet -= elem //完成一个任务就从set里面剔除,循环出口
}
}
}
//将两个actor的结果相加排序
print(lbf.flatMap(_.toList).groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2)).toList.sortBy(_._2))
//发送消息给actor,通知程序结束
new Task().start() !! Terminate("00")
}

猜你喜欢

转载自www.cnblogs.com/weisongsong/p/10005984.html
今日推荐