2013-01-20 74 views
0

我需要創建一個方法,將參數作爲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; 
    } 
} 

我沒有測試代碼,但我可以看到這個問題會來,如果其他線程設置保留我爲0或一些比maxValue這個循環值少將走向無限。雖然它應該是更好的東西。任何想法的傢伙?

編輯:
深例
i=0maxValue=2000

DoStuff被調用,當i達到100環通,i得到了由其它線程設置爲1600,環是繼續前進,但再次i得到設定到30相同的其他線程,然後一次又一次它被其他線程設置,直到valuesSet中的所有項目被調用SomeMethod(i)。但問題是,如果像1998年或1999年等valuesSet中的1個或多個項目保持設置爲0或10或100那樣更低,則循環具有很低的中斷或完成概率。

我要的是,如果一旦一個數字(0至包括maxValue)被調用的SomeMethod,決不能再次調用,而起始編號保存更改並SomeMethod必須呼籲所有的號碼,直到包括maxValue。如果SomeMethod被調用到maxValue並仍然有數字,它應該以最小的數字重新開始。

+0

除了被線程設置之外''我是否在'DoStuff'方法之外使用? –

+0

'我'會在DoStuff之外,可以在任何地方,但在外面。 – xmen

+0

你肯定在正確的軌道上使用'valueSet'來記錄你已經傳遞給'SomeMethod'的參數。我不認爲你已經將其餘的要求解釋爲我理解他們的地步。 –

回答

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()返回的一個是:只有

  • 這一個從零到包括maxValue迭代。
  • 這一個有​​方法,以便它可以由多個線程共享。

如果這是您需要的,您還可以添加reset方法。

+0

我已經添加了另一個示例,希望它能夠解釋清楚:) – xmen