我想有一个可以被多个线程并发读取的迭代器,这样我就可以并行处理迭代器源的数据。挑战在于我不能真正将 hasNext()
与其逻辑 next()
结合起来,因为它们可能会转到不同的线程。 (也就是说,两个线程可以调用 hasNext()
,每个线程都看到 true,然后让第二个线程失败,因为只有一个项目。)我的问题是,对于某些来源,我真的不知道知道它是否有下一个元素,直到我尝试阅读它。一个这样的例子是从文件中读取行;另一个正在从 Lucene 索引中读取 Term
实例。
我正在考虑在迭代器中设置一个队列,并为队列提供一个单独的线程。这样,hasNext()
是根据队列大小实现的。但我不明白如何保证队列已满,因为该线程可能会饿死。
我是否应该忽略 Iterator 契约,只调用 next()
直至抛出 NoSuchElementException
?
有没有更优雅的方法来处理这个问题?
最佳答案
你的线程可以从 BlockingQueue 中提取吗?而不是迭代器。正如您所发现的,迭代器不太适合并发访问。
传递一个 LinkedBlockingQueue,并让您的线程执行 queue.poll() 直到什么都不剩下。
关于java - 如何在某些源上创建并发迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5893096/