我有一个基于数组的对象,它实现了以下接口:
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
}
在接下来的方法中,我想从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 个线程使用。