您的位置:首页 > 其它

Scala简单单机actorwordcount

2017-10-20 15:07 253 查看
import scala.actors.{Actor, Future}
import scala.collection.mutable.{HashSet, ListBuffer}
import scala.io.Source

class Task extends Actor {
override def act() : Unit = {
loop {
react {
case SubmitTask(filename) => {
val result = Source.fromFile(filename).getLines().flatMap(_.split(" ")).map((_, 1)).toList.groupBy(_._1).mapValues(_.size)
sender ! ResultTask(result)
}

case StopTask => {
exit()
}
}
}
}
}

case class SubmitTask(filename : String)
case class ResultTask(result : Map[String, Int])
case object StopTask

object ActorWordCount {
def main(args: Array[String]): Unit = {

val replySet = new HashSet[Future[Any]]()
val resultList = new ListBuffer[ResultTask]()

val files = Array[String]("f://words.txt", "f://words.log")

for (f <- files) {
val actor = new Task
val reply = actor.start() !! SubmitTask(f)
replySet += reply
}

while (replySet.size > 0) {
val toCompute = replySet.filter(_.isSet)
for (f <- toCompute) {
val result = f.apply().asInstanceOf[ResultTask]
resultList += result
replySet -= f
}
Thread.sleep(100)
}
//汇总功能
val fr = resultList.flatMap(_.result).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2))
println(fr)
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: