としてパラメータを取るメソッドを作成する必要がありますmaxValue
。0 からループしますが、一度 1 つのインデックスを使用すると、それを再度使用してはなりません。
説明:
例を見てみ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;
}
}
maxValue
私はこのコードをテストしていませんが、他のスレッドが i を 0 またはそれより小さい値に設定し続け、このループが無限になると問題が発生することがわかります。それはもっと良いものでなければなりませんが。アイデアはありますか?
編集:
深い例
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 まで呼び出され、まだ番号が残っている場合は、最小の番号から再度開始する必要があります。