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

标签 java concurrency synchronization iterator

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

我正在考虑在迭代器中设置一个队列,并为队列提供一个单独的线程。这样,hasNext() 是根据队列大小实现的。但我不明白如何保证队列已满,因为该线程可能会饿死。

我是否应该忽略 Iterator 契约,只调用 next() 直至抛出 NoSuchElementException

有没有更优雅的方法来处理这个问题?

最佳答案

你的线程可以从 BlockingQueue 中提取吗?而不是迭代器。正如您所发现的,迭代器不太适合并发访问。

传递一个 LinkedBlockingQueue,并让您的线程执行 queue.poll() 直到什么都不剩下。

关于java - 如何在某些源上创建并发迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5893096/

相关文章:

java - @ManyToOne 错误 - JPA/Hibernate 分离实体传递到持久化

java - android studio\Java\jdk1.8.0_65\bin\java.exe 中的错误'' 以非零退出值 2 完成

java - 使实例同时只能由一个线程访问吗?

Qt: 如何实现 "per minute"定时器?避免失火和双火的更好选择?

JAVA-网络日志文件

java -\u65549 是有效的 Java 标识符吗?

c++ - 多个线程/进程可以在不同步的情况下同时读取/写入文件的非重叠区域吗?

java - 自己的 SeqLock 实现,避免自旋锁会更好吗?

java - 字段读取同步和 volatile 之间的可见性差异

OpenGL计算着色器同步不同的工作组