我想有一个可以被多个线程并发读取的迭代器,这样我就可以并行处理迭代器源数据。面临的挑战是,我无法将hasNext()
与其逻辑next()
结合在一起,因为这些可以转到不同的线程。 (也就是说,两个线程可以调用hasNext()
,每个都是正确的,然后让第二个线程失败,因为只有一个项目。)我的问题是,对于某些源,我不知道它是否有下一个元素,直到我尝试阅读它。一个这样的例子是从文件中读取行;另一个是从Lucene索引读取Term
实例。如何在某些源上创建并发迭代器?
我正在考虑在迭代器中设置一个队列,并为队列提供一个单独的线程。那样,hasNext()
是根据队列大小实现的。但我不明白我怎么能保证队列被填满,因为那个线程可能会饿死。
我应该忽略迭代器合约,只需拨打next()
直到NoSuchElementException
被抛出?
有更好的方法来处理这个问题吗?
感谢您的快速响应。这是有道理的,但我需要以确保它不饿的方式填补队列,对吗?我无法将所有元素放入队列中,因为可能太多元素不适合内存。我想除了队列之外,我还必须有一个'AtomicBoolean',它表示没有更多的记录会被添加到队列中。 – 2011-05-05 05:53:37
你可以让你的线程做一个queue.take(),并且有一些毒丸(http://www.javaspecialists.eu/archive/Issue016.html)来表明没有什么可做的。 – sbridges 2011-05-05 06:00:57
难道这仍然不会有多个线程调用'take()'并让其中一个获得毒丸,而另一个线程挂在一个空队列上?这意味着'take()'必须在主线程中完成,然后将值分派给工作线程。或者我错过了什么? – 2011-05-05 06:32:27