0

我正在创建一个 Android 游戏,但遇到了问题。我有 2 个线程:OpenGL 线程和游戏循环。我使用 ArrayLists 来存储我的可渲染对象,这就是问题所在。有时我需要在游戏线程中删除这些对象,有时它会导致 OpenGL 线程获取 NullPointerException,因为据我了解,它通过集合并突然删除了一个元素。我想我应该让 OpenGL 线程删除对象,但还有其他解决方案吗?如果游戏循环开始获取空元素怎么办?也许我可以以某种方式制作同步线程,尽管我仍然不明白“同步”是如何工作的。谢谢。

这会有帮助吗?我应该把它放在我对 ArrayList 做某事的任何地方吗?

synchronized (arrayListName) 
{ 
    arrayListName.remove(object); 
}
4

2 回答 2

2

我仍然不明白“同步”是如何工作的

这是你需要补救的事情。Java 中的并发构造包括synchronized基本概念。我建议选择Effective Java, 2nd ed.

http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683

一个基本想法是,如果您有一个原子操作,其中一个线程读取列表项,然后另一个线程读取列表项,您需要使用二进制信号量锁定它 - 最简单的方法是使用 Java 同步构造.

一种不太天真的方法可能是让线程一从列表中提取值,做它需要做的事情,然后将值“传递”给线程 2,例如,通过将项目添加到线程 2 拥有的队列中。

如果不熟悉代码,几乎不可能为您的应用程序描述“正确”的解决方案。我只是在胡乱猜测。

于 2012-03-28T13:54:16.837 回答
0

杰弗里的回答是正确的,但总结一下这本书会说什么:

java.util.concurrent在需要时使用。” (释义)

基本上,不要重新创建轮子。该java.util.concurrent包是一个非常优化的线程安全类的集合,例如ConcurrentHashMap

看看这个相关的 StackOverflow 问题:

https://stackoverflow.com/questions/10395903/why-is-there-not-concurrent-arraylist-in-java-util-concurrent-package

进一步阅读:

http://www.ibm.com/developerworks/java/library/j-5things4/index.html

http://developer.android.com/reference/java/util/concurrent/package-summary.html

于 2012-09-11T06:01:46.180 回答