Iterable<X>
多数の要素を持つ不変のものがあります。(たまたまですが、List<>
気にしないでください。)
私がやりたいことは、いくつかの並列/非同期タスクを開始しIterable<>
て、同じ反復子で反復処理することです。どのインターフェイスを使用すればよいか考えています。
to-be-determined インターフェイスを使用した実装例を次に示します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 */
}
これが私の問題です:
hasNext() と next() には同期の問題があるため、直接使用しても意味がありません
Iterator
。hasNext() は、誰かが next() を呼び出す前に呼び出すと役に立ちません。を使いたいのです
Queue
が、必要な唯一の方法はpoll()
ConcurrentLinkedQueue を使用して多数の要素を保持したいのですが、要素を複数回反復処理する必要がある場合を除き、それを使用することはできません。
助言がありますか?