我需要创建一个将参数作为maxValue
的方法。并从0开始循环,但一旦使用一个索引,就不能再使用它了。
解释
让我们举一个例子,maxValue
是2000.现在它应该从0到2000,但是起始索引会被其他线程保持更改。就像它可以再次为0或者它可以是1900或1999,可以是小于maxValue
的任何数字。所以它应该保持循环从开始索引到结束,然后循环其余的项目。
以下是我的尝试:
public int i = 0; //keep changes by other thread
public void DoStuff(int maxValue) {
HashSet<Integer> valuesSet = new HashSet<Integer>();
// fill hashset
for (int a = 0; a < maxValue; a++)
valuesSet.add(a);
for (; i < maxValue; i++) {
if (valuesSet.contains(i)) {
valuesSet.remove(i);
// SomeMethod(i);
}
if (valuesSet.isEmpty())// must check isEmpty first
break;
if (i == (maxValue - 1)) // reset i to 0 to use remaining items in hashset
i = 0;
}
}
我还没有测试过这段代码,但是如果其他线程将i设置为0或者比maxValue
更少的值,我可以看到问题会出现,这个循环将变为无限。虽然它应该是更好的东西。任何想法的人?
编辑:
深刻的例子
i=0
和maxValue=2000
DoStuff被调用,当i
通过循环达到100时,i
被其他线程设置为1600,循环继续进行,但i
被同一个其他valuesSet
设置为30线程,然后一次又一次地由其他线程设置,直到SomeMethod(i)
中的所有项目都被调用valuesSet
。但问题是,如果i
中有一个或多个项目,如1998或1999,并且SomeMethod
保持设置为低于0或10或100,则循环中断或完成的可能性非常低。 / p>
我想要的是,如果在SomeMethod
中调用一个数字(0到maxValue),则不能再次调用它,而起始数字会保持更改而SomeMethod
必须全部调用数字直到maxValue。如果{{1}}被调用到maxValue并且仍然是数字,那么它应该以最小的数字重新开始。
答案 0 :(得分:0)
您的要求不明确,但您似乎在描述应该作为自定义Iterator
类实现的内容。例如:
public class MyIterator<T> implements Iterator<T> {
private int maxValue;
private int pos;
private List<T> list;
public ListIterator(List<T> list, int maxValue) {
this.list = list;
this.maxValue = maxValue;
}
public synchronized T next() {
if (pos < list.size() && pos <= maxValue) {
return list.get(pos++);
} else {
throw ...
}
}
// etcetera.
}
然后,您可以将此类的实例提供给您希望能够参与迭代的特定线程。其他线程无法干预。实际上,其他线程可以使用不同的实例......并独立迭代。
请注意,此自定义迭代器与List.iterator()
返回的迭代器之间的唯一区别是:
synchronized
个方法,因此可以由多个线程共享。如果您需要,还可以添加reset
方法。