我正在安卓系统上制作一个有三个线程的游戏。这些将是我的GL渲染线程,我的游戏更新线程和UI线程。
游戏围绕着一个ArrayList
(以及一个规则阵列)的"球"对象展开。用户通过敲击屏幕创建一个球,游戏更新线程在屏幕上移动球,渲染线程绘制所有球。
我遇到的问题是处理并发问题,这是由于许多线程访问相同的数据(即球的数组)而引起的。一个特别的问题是当游戏线程移除球并且渲染线程试图访问移除的球时接收out of bounds exception
。
如果你考虑一下我发布的代码示例。确保这两个代码块中的任何一个(在不同的线程上)开始执行后,另一个在完成之前无法启动的最佳方法是什么?
渲染线程
int size = balls.size();
for(int i = 0; i < size; i++){
Ball ball = balls.get(i);
drawBall(ball.xCoord, ball.yCoord, ball.image);
}
游戏和
int size = balls.size();
for(int i = size -1; i >= 0; i--){
Ball b = balls.get(i);
b.updateBallPosition();
b.updateBallVelocity();
if(b.isOutOfBounds())
balls.remove(i);
}
使用synchronized
块确保代码的一部分互斥:
final Object lock = new Object(); // globally visible lock object
渲染线程:
synchronized(lock) {
int size = balls.size();
for(int i = 0; i < size; i++){
Ball ball = balls.get(i);
drawBall(ball.xCoord, ball.yCoord, ball.image);
}
}
游戏线程:
synchronized(lock) {
int size = balls.size();
for(int i = size -1; i >= 0; i--){
i.updateBallPosition();
i.updateBallVelocity();
if(i.isOutOfBounds())
balls.remove(i);
}
}
此时,两个线程中只有一个可以执行代码,而另一个将阻塞。请注意,它们必须在同一个锁对象上同步。