Gen*_*sky 3 java concurrency synchronization iterator
我想有一个可以被多个线程同时读取的迭代器,以便我可以并行处理迭代器源的数据.挑战在于我无法真正地hasNext()与其逻辑耦合,next()因为那些可能会转向不同的线程.(也就是说,两个线程可以调用hasNext(),每个都看到true,然后让第二个线程失败,因为只有一个项目.)我的问题是,对于某些来源,我真的不知道它是否有下一个元素,直到我尝试阅读它.一个这样的例子是从文件中读取行; 另一个是Term从Lucene索引中读取实例.
我正在考虑在迭代器中设置一个队列,并用一个单独的线程为队列提供数据.这样,hasNext()就队列大小而言.但我不知道如何保证队列被填满,因为该线程可能会饿死.
我是否应该忽略迭代器合约,并且只需要next()彻底打电话直到NoSuchElementException被抛出?
有更优雅的方式来处理这个问题吗?
您的线程是否可以从BlockingQueue而不是Iterator中提取.正如您所发现的,迭代器不适合并发访问.
传递一个LinkedBlockingQueue,让你的线程做queue.poll(),直到没有剩下.
| 归档时间: |
|
| 查看次数: |
5294 次 |
| 最近记录: |