次のインターフェイスを実装する配列に基づくオブジェクトがあります。
public interface PairSupplier<Q, E> {
public int size();
public Pair<Q, E> get(int index);
}
その上に特定のイテレータを作成したいと思います:
public boolean hasNext(){
return true;
}
public Pair<Q, E> next(){
//some magic
}
メソッドnextで、 PairSupplierからいくつかの要素を返したいと思います。
この要素はスレッドに対して一意である必要があり、他のスレッドにはこの要素が含まれていてはなりません。
PairSupplier には最終的なサイズがあるため、常にこのような状況になるとは限りませんが、アプローチしたいと考えています。
要素の順序は関係ありません。スレッドは同じ要素を別の時点で取得できます。
例: 2 Threads
, 5 elements
-{1,2,3,4,5}
Thread 1 | Thread 2
1 2
3 4
5 1
3 2
4 5
私の解決策:
次の呼び出しごとにインクリメントする AtomicInteger インデックスを作成します。
PairSupplier pairs;
AtomicInteger index;
public boolean hasNext(){
return true;
}
public Pair<Q, E> next(){
int position = index.incrementAndGet() % pairs.size;
if (position < 0) {
position *= -1;
position = pairs.size - position;
}
return pairs.get(position);
}
ペアとインデックスはすべてのスレッドで共有されます。
このソリューションはスケーラブルではないことがわかりました (すべてのスレッドがインクリメントになるため)。おそらく誰かがより良いアイデアを持っていますか?
この反復子は、50 ~ 1000 のスレッドで使用されます。