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;
    }
}

我还没有测试过这段代码,但我可以看到如果其他线程保持将 i 设置为 0 或小于这个值maxValue并且这个循环将无限期,问题将会出现。虽然它应该是更好的东西。有什么想法吗?

编辑:
深度示例
i=0maxValue=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 并且仍然有数字,它应该以最小的数字重新开始。

4

1 回答 1

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。
  • 这个有synchronized方法,可以被多个线程共享。

reset如果这是您需要的,您也可以添加一个方法。

于 2013-01-20T04:27:40.947 回答