Scala队列和NoSuchElementException

Scala队列和NoSuchElementException,scala,exception,queue,Scala,Exception,Queue,在Scala 2.9.2队列上操作时,我遇到了一个罕见的NoTouchElementException错误。我不理解这个异常,因为队列中有元素。我曾尝试切换到SynchronizedQueue,认为这是一个并发问题(我的队列是从不同的线程写入和读取的),但这并没有解决它 简化后的代码如下所示: val window = new scala.collection.mutable.Queue[Packet] ... (thread 1) window += packet ... (thread 2)

在Scala 2.9.2队列上操作时,我遇到了一个罕见的NoTouchElementException错误。我不理解这个异常,因为队列中有元素。我曾尝试切换到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()的文档说


但是,如果队列不是空的,如何引发此异常?

您应该只从单个线程访问
窗口(可变数据结构)。其他线程应该向该线程发送消息

有一种方法允许相对容易的并发编程

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)

不要使用可变共享数据您如何确定它不是空的?或者,如果您想要共享可变队列,请使用。比手动同步容易。我无法重现您的问题。你能举一个遇到你问题的程序的小例子吗?您提供的那个似乎不适合我(使用Int而不是Packet,并且=>true作为someFunction)
  // context.schedule(1 second, 1 second, CheckMessages)