前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Scala Acotor实现多线程单词统计(WordCount)

基于Scala Acotor实现多线程单词统计(WordCount)

作者头像
天策
发布2018-06-22 14:41:32
6290
发布2018-06-22 14:41:32
举报
文章被收录于专栏:行者悟空

摘 要

基于Scala Acotor实现多线程单词统计(WordCount)

代码语言:javascript
复制
package com.itunic.scala

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

/**
  * Created by itunic.com on 2016/12/9.
  */
class WordCountActor extends Actor {
  override def act(): Unit = {
    loop {
      react {
 case SubmitTask(fileName) => {
 //Map(tom -> 1, jm -> 2, 666 -> 2, hello -> 3)
 //每个线程单独计算一次
          val result = Source.fromFile(fileName).getLines().flatMap(_.split("\t")).map((_, 1)).toList.groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2))
          sender ! ResultTask(result)
        }
 case StopTask => {
          exit()
        }

      }
    }
  }
}

//提交任务样例类
case class SubmitTask(fileName: String)

//返回结果样例类
case class ResultTask(result: Map[String, Int])

//结束任务样例类
case object StopTask

object WordCountActor {
  def main(args: Array[String]): Unit = {
 //存放返回结果集
    val resultSet = new mutable.HashSet[Future[Any]]()
 //汇总结果集
    val resultList = new mutable.ListBuffer[ResultTask]
 //文件池
    val files = Array("F:\\test.txt", "F:\\test1.txt", "F:\\test.txt", "F:\\test1.txt")
 //循环读取并启动线程
 for (i <- files) {
      val actor = new WordCountActor
 //启动并异步接收结果
      val result = actor.start() !! SubmitTask(i)
      resultSet += result
    }

 //合并结果集
 while (resultSet.size > 0) {
      val toCumpute = resultSet.filter(_.isSet)
 //println(toCumpute.toBuffer)
 for (i <- toCumpute) {
        val res = i.apply().asInstanceOf[ResultTask]
        resultList += res
        resultSet.remove(i)
      }
 //防止死鎖休眠100毫秒
      Thread.sleep(100)

    }
 //计算最终结果
    val count = resultList.flatMap(_.result).toList.groupBy(_._1).mapValues(_.foldLeft(0)(_ + _._2))
    println(count)

  }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年12月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档