1

基本的に平均を行うscalaアクターの実装があります。合計とカウントを維持するエントリをプッシュし、平均を計算します。何が起こっているのかというと、テスト中にこれをタイトループで実行すると、エントリを見逃してしまい、それが最後のエントリだと思います。アクターは次のようになります。

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 を呼び出した後、キューが処理されることを確認するために約 200 ミリ秒待ちます。(または、それが私がやっていることだと思います、これが問題の場所ですか?)

Edit2:基本的に、これらの値をタイトなループで設定し、すぐに終了を呼び出していたため、最後のエントリまたはエントリが処理されていないか、削除されていたと思います。ループの終わりの間に小さなスリープを入れました (実際には、これは CountDownLatch.await と actor.stop であり、テストを失敗させることはできません。

4

1 に答える 1

0

あなたの実装は、それ以外の場合は停止するreact限り、にのみ入ります。と同等の でLongラップし、一致する式を追加して代わりに を停止できます。がアクターに送信され、アクターが停止するため、一致しません。loopwhile (true)actoractor ! 10case 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()

これが私の提案です。

于 2012-08-23T05:53:42.327 に答える