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

Gen*_*sky 3 java concurrency synchronization iterator

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

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

我是否应该忽略迭代器合约,并且只需要next()彻底打电话直到NoSuchElementException被抛出?

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

sbr*_*ges 6

您的线程是否可以从BlockingQueue而不是Iterator中提取.正如您所发现的,迭代器不适合并发访问.

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