0

我在 android 中使用 OpenGL,他们有一个名为 draw 的回调方法,它在我无法控制的情况下被调用。(如果我没记错的话,设备可以处理的最快)我有一个“游戏对象”列表,其中包含一个 .draw 方法和一个 .update 方法。我有两个不同的线程来处理每个线程。所以,问题是,我可以在两个不同的线程中用两个不同的方法声明两个不同的迭代器吗?如果是这样,我ListIterator<GameObject> l = objets.listIterator()是否每次想要一个新的迭代器时都简单地声明并且它不会干扰其他迭代器?

4

3 回答 3

1

是的,同一个列表可以有多个迭代器。他们不会互相干扰。

您不能做的是在迭代器仍处于活动状态时修改列表(我的意思是,您可以,但这会破坏迭代器,它们会因异常而失败)。

于 2012-11-23T05:00:36.580 回答
1

这将工作得很好,使用多个迭代器迭代单个实例不是问题。

只要您使用 a SynchronizedList,就没有理由不能修改列表。将SynchronizedList阻止对列表的并发修改并使其成为线程安全的。

如果您可以使用 Guava 库,我建议您使用它,并使用它们的SynchronizedList数据结构,以及它们的Iterables.filterIterables.transform方法以及PredicatesFunctions列表进行排序和转换。

更多关于 Guava 库的信息:

http://code.google.com/p/guava-libraries/

http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html

为了清楚起见:

在迭代列表时,您必须在块中同步列表,如下所示:

synchronized(list) {
    Iterator i = list.iterator(); // Must be in synchronized block
        while (i.hasNext()){
            foo(i.next());
        }
} 
于 2012-11-23T05:04:58.543 回答
0

是的你可以。只需确保在迭代期间您没有修改列表。如果您打算这样做;请同步迭代。

于 2012-11-23T05:04:31.737 回答