У меня есть объект на основе массива, который реализует следующий интерфейс:
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, который я увеличиваю при каждом вызове next.
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 потоков.