Scala队列和NoSuchElementException
在Scala 2.9.2队列上操作时,我遇到了一个罕见的NoTouchElementException错误。我不理解这个异常,因为队列中有元素。我曾尝试切换到SynchronizedQueue,认为这是一个并发问题(我的队列是从不同的线程写入和读取的),但这并没有解决它 简化后的代码如下所示: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)
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)