Exception in thread "main" java.lang.AssertionError: assertion failed: receive from channel belonging to other actor
at scala.actors.InternalActor$class.receive(InternalActor.scala:87)
at com.home.actor.Task.receive(ActorWordCount.scala:39)
at com.home.actor.Task.act(ActorWordCount.scala:42)
at com.home.actor.ActorWordCount$$anonfun$main$1.apply(ActorWordCount.scala:18)
at com.home.actor.ActorWordCount$$anonfun$main$1.apply(ActorWordCount.scala:16)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
at com.home.actor.ActorWordCount$.main(ActorWordCount.scala:16)
at com.home.actor.ActorWordCount.main(ActorWordCount.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
代码如下:
import scala.actors.{Future, Actor}
import scala.collection.mutable.ListBuffer
import scala.io.Source
/**
* Created by li.ma on 2020/7/1.
*/
object ActorWordCount {
def main(args: Array[String]) {
val files = Array("D:\\temp\\1.txt", "D:\\temp\\2.txt", "D:\\temp\\3.txt")
val futureList :ListBuffer[Future[Any]] = new ListBuffer[Future[Any]]();
for (file <- files) {
val task = new Task
task.act()
val res : Future[Any] = task !! SmTask(file)
futureList += res
}
val resMap : ListBuffer[Map[String, Int]] = new ListBuffer[Map[String, Int]]
while (futureList.size > 0) {
val setList : ListBuffer[Future[Any]] = futureList.filter(_.isSet)
for(item <- setList) {
resMap += item.apply().asInstanceOf[Map[String, Int]]
futureList.-=(item)
}
}
println(resMap.flatten.groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)))
}
}
class Task extends Actor {
override def act(): Unit = {
while(true) {
receive({
case SmTask(file) => {
val lines : List[String] = Source.fromFile(file).getLines().toList
val words : List[String] = lines.flatMap(_.split(" "))
val res :Map[String, Int] = words.map((_, 1)).groupBy(_._1).mapValues(_.size)
sender ! res
}
})
}
}
}
case class SmTask(file:String) {
}
出现这样的错误,最后定位为:
val task = new Task task.act()
应该改成 task.start()