我有一个scala actor实现,基本上是平均值。我推了一个条目,维护一个总计和一个计数,并找出平均值。发生的事情是,当我在测试期间以紧凑的循环运行时,我错过了一个条目,我相信这是最后一个。 演员是这样的:
val actor = new Actor { def act = react {
case v: Long => addEntry(v); act
case _ => ()
}}.start()
编辑:addEntry的实现是:
private def addEntry(v: Long) {
total = total + v
count = count + 1
avg = total / count
}
并且添加基本上是actor ! 10
,依此类推
我在测试中调用stop后,我等待大约200ms以确保队列处理完毕。 (或者我认为这就是我在做什么,问题出在哪里?)
Edit2:基本上,我认为现在因为我在紧密循环中设置这些值然后立即调用exit,最后一个或多个条目未被处理或被删除。我在循环结束之间放了一个小睡眠(实际上它是一个CountDownLatch.await和actor.stop,现在我不能让测试失败。
答案 0 :(得分:0)
只要您获得react
,您的实施只会输入Long
,否则会停止。您可以使用loop
(相当于while (true)
)对其进行换行,然后添加匹配的表达式来阻止actor
。 actor ! 10
与case v: Long => ...
不匹配,因为Int
已发送给演员,因此演员将停止。
val actor = new Actor {
def act() = {
loop {
react {
case "stop" => exit() // you might create a messageobject instead
case l: Long => addEntry(l)
case i: Int => addEntry(i.toLong)
}
}
}
}.start()
这是我的建议。