我有一个Iterable<X>
包含大量元素的不可变对象。(它恰好是一个List<>
但没关系。)
我想做的是启动一些并行/异步任务来迭代Iterable<>
相同的迭代器,我想知道我应该使用什么接口。
这是一个带有待确定接口的示例实现QuasiIteratorInterface
:
public void process(Iterable<X> iterable)
{
QuasiIteratorInterface<X> qit = ParallelIteratorWrapper.iterate(iterable);
for (int i = 0; i < MAX_PARALLEL_COUNT; ++i)
{
SomeWorkerClass worker = new SomeWorkerClass(qit);
worker.start();
}
}
class ParallelIteratorWrapper<T> implements QuasiIteratorInterface<T>
{
final private Iterator<T> iterator;
final private Object lock = new Object();
private ParallelIteratorWrapper(Iterator<T> iterator) {
this.iterator = iterator;
}
static public <T> ParallelIteratorWrapper<T> iterate(Iterable<T> iterable)
{
return new ParallelIteratorWrapper(iterable.iterator());
}
private T getNextItem()
{
synchronized(lock)
{
if (this.iterator.hasNext())
return this.iterator.next();
else
return null;
}
}
/* QuasiIteratorInterface methods here */
}
这是我的问题:
直接使用没有意义
Iterator
,因为 hasNext() 和 next() 存在同步问题,如果其他人在你之前调用 next(),hasNext() 是无用的。我很想使用
Queue
,但我需要的唯一方法是poll()
我很想使用 ConcurrentLinkedQueue 来保存我的大量元素......除了我可能不得不多次遍历元素,所以我不能使用它。
有什么建议么?