2012-08-22 3 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하고 그래서 내가 시험에 정지를 호출 한 후

에 대기열이 처리되는지 확인하기 위해 약 200ms를 기다립니다. (또는 그게 내가 무엇을하고 있는지, 문제가있는 곳입니까?)

Edit2 : 기본적으로, 저는 지금 당장이 값을 엄격한 루프에 설정하고 나서 즉시 종료를 호출했기 때문에 마지막 항목 또는 항목이 처리 중이거나 삭제되지 않았습니다. 내가 루프의 끝 사이에 작은 잠을 넣어 (실제로는 CountDownLatch.await 및 actor.stop 그리고 지금은 테스트가 실패 할 수 없습니다.

+0

'addEntry (v)'의 구현과 어떻게 액터에 메시지를 제출할 수 있습니까? –

답변

0

귀하의 구현은 오래 당신이 Long를 얻을으로 만 react를 입력 멈출 그렇지. 당신은 while (true)에 해당하는 loop로 포장하고, 대신 actor을 중지 일치하는 표현을 추가 할 수 있습니다. Int이 배우로 전송되고 그래서 배우가 중지됩니다 때문에 actor ! 10case 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() 

이것은 내 sugges가 될 것입니다. .

+0

알아 차리면 addEntry (long)에서 반복적으로 act를 호출합니다.이 동작은 본질적으로 루프 밖에서 루프를 사용하는 것과 같습니다. 또한, 내 구현에서 나는 오랫동안에만 관심. – Alex

+0

네, 눈치 챘지만 좋은 습관은 아닙니다. 그리고 예, 당신은 Longs에 대해서만 관심이 있지만, 당신은 Int를 Actor에게 보냈습니다. 그래서 저는 그 사건도 또한 다루고 싶었습니다. –

관련 문제