2010-03-13 139 views
3

主题的帮助,我需要一些帮助,三个线程在Android的处理与Android游戏

一个线程是主线程,另一种是GLThread,另一个是我创建更新的游戏状态的WorkerThread。

我遇到的问题是他们都需要访问相同的游戏对象LinkedList。 GLThread和我的WorkerThread都只能从LinkedList中读取,所以在那里没有问题,但偶尔我有主线程将另一个游戏对象添加到列表中。

我该如何管理?我尝试在涉及的函数前使用synchronized,但它确实减慢了应用程序的速度。

由于某些原因,只捕获错误并且不呈现或更新游戏状态,会导致游戏永久滞后。

任何人有任何伟大的想法?

回答

1

我会建议一个CopyOnWriteArrayList。这会在副本发生变化时复制后备列表,但允许在读取时与读取列表的时间相关的非同步读取。

0

有很多种方法可以做到这一点:如果你的列表不是太大,那么你可以CAS(比较和设置)列表,这是一个原子操作。这要求您创建列表的副本,添加需要添加的项目,然后添加CAS而不锁定。如果它只是偶尔发生,那么它不会是一个重大的开销。 CAS是来自Java的atomic libraryAtomicReference的一种方法......正如Software Monkey提到的,CopyOnWriteArrayList可以实现同样的功能。或者,您也可以查看Java的concurrency library中的各种容器,或者如果您想拥有无锁集合,请使用ConcurrentHashMap