如何在某些源上创建并发迭代器?

我想有一个可以被多个线程同时读取的迭代器,以便我可以并行处理迭代器源的数据.挑战在于我无法将hasNext()与其逻辑next()结合起来,因为它们可能会转到不同的线程. (也就是说,两个线程可以调用hasNext(),每个都看到true,然后让第二个线程失败,因为只有一个项目.)我的问题是,对于某些来源我真的不知道它是否有下一个元素直到我尝试阅读它.一个这样的例子是从文件中读取行;另一个是从Lucene索引中读取Term实例.

我正在考虑在迭代器中设置一个队列,并用一个单独的线程为队列提供数据.这样,hasNext()就队列大小而实现.但我不知道如何保证队列被填满,因为该线程可能会饿死.

我应该忽略Iterator合约,只是彻底调用next()直到抛出NoSuchElementException?

有更优雅的方式来处理这个问题吗?

解决方法:

你的线程可以从BlockingQueue而不是迭代器中拉出来.正如您所发现的,迭代器不适合并发访问.

传递一个LinkedBlockingQueue,让你的线程做queue.poll(),直到没有剩下.

上一篇:是C读取和写入的原子?


下一篇:关于书籍示例的问题 – 实践中的Java并发,清单4.12