2

Scala 2.9.2 キューを操作しているときに、まれに NoSuchElementException エラーが発生します。キューに要素が含まれているため、例外がわかりません。SynchronizedQueue に切り替えようとしましたが、これは同時実行の問題 (私のキューは別のスレッドから書き込まれ、読み取られます) であると考えていましたが、解決しませんでした。

削減されたコードは次のようになります。

val window = new scala.collection.mutable.Queue[Packet]
...
(thread 1)
window += packet
...
(thread 2)
window.dequeueAll(someFunction)
println(window.size)
window.foreach(println(_))

その結果、

32
java.util.NoSuchElementException
    at scala.collection.mutable.LinkedListLike$class.head(LinkedListLike.scala:76)
    at scala.collection.mutable.LinkedList.head(LinkedList.scala:78)
    at scala.collection.mutable.MutableList.head(MutableList.scala:53)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.mutable.MutableList.foreach(MutableList.scala:30)

LinkedListLike.head() のドキュメントは言う

 Exceptions thrown
 `NoSuchElementException`
 if the linked list is empty.

しかし、キューが空でない場合、どのようにこの例外をスローできますか?

4

1 に答える 1

0

window単一のスレッドからのみ (変更可能なデータ構造) にアクセスする必要があります。他のスレッドは、そのスレッドにメッセージを送信する必要があります。

比較的簡単な並行プログラミングを可能にするAkkaがあります。

class MySource(windowHolderRef:ActorRef) {
  def receive = {
    case MyEvent(packet:Packet) =>
      windowHolderRef ! packet
  }
}

case object CheckMessages

class WindowHolder {
  private val window = new scala.collection.mutable.Queue[Packet]
  def receive = {
    case packet:Packet =>
      window += packet
    case CheckMessages =>
      window.dequeueAll(someFunction)
      println(window.size)
      window.foreach(println(_))
  }
}

メッセージを定期的にチェックするには、定期的なメッセージをスケジュールできます。

  // context.schedule(1 second, 1 second, CheckMessages)
于 2013-09-23T06:41:22.307 に答える