我需要创建一个将参数作为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
被同一其他线程设置为 30,然后一次又一次地被其他线程设置,直到所有项目在valuesSet
被叫进来SomeMethod(i)
。但问题是,如果valuesSet
像 1998 年或 1999 年那样留下 1 个或多个项目并i
保持设置为较低的值,如 0、10 或 100,则循环中断或完成的机会非常低。
我想要的是,如果一旦调用了一个数字(0到maxValue)SomeMethod
,它就不能再次被调用,而起始数字保持变化并且SomeMethod
必须用所有数字调用直到maxValue。如果SomeMethod
被调用直到 maxValue 并且仍然有数字,它应该以最小的数字重新开始。