2012-08-22 67 views
1

我有一個斯卡拉演員的實現,基本上做平均。我推入維持總計和計數的條目並計算出平均值。發生了什麼事情的時候,我在測試過程中以嚴密的循環運行這個測試,我錯過了一個入口,我相信這是最後一個。 演員是這樣的:斯卡拉演員和刪除的條目

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

後,我打電話停止測試,我等待大約200毫秒,以確保隊列被處理。 (或者我認爲這就是我在做什麼,這是問題所在?)

編輯2:基本上,我現在認爲,因爲我在緊密循環中設置這些值,然後立即調用退出,最後一項或條目正在/未被處理或正在被丟棄。我把循環結束之間有一個小的睡眠(實際上這是一個CountDownLatch.await和actor.stop,現在我不能讓測試失敗。

+0

你可以顯示'addEntry(v)'的實現以及如何將消息提交給actor? –

回答

0

你實現只只要你得到Long進入react否則停止。你可以用loop包起來,這相當於while (true),並添加匹配表達式停止actor來代替。因爲Int被髮送到演員,所以演員將停止actor ! 10將不匹配case v: Long => ...

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() 

這將是我的建議灰。

+0

如果你注意到,我從addEntry(long)中遞歸地調用,這與使用外部循環基本相同。另外,在我的實施中,我只關心long的。 – Alex

+0

是的,我注意到了,但這不是很好的做法。是的,你只關心Longs,但是你給Int發送了一個Int,所以我也想要覆蓋這個案例。 –