不同线程之间的代码块序列化

时间:2012-03-06 19:17:24

标签: java android multithreading thread-safety

我在android上制作了一个有三个线程的游戏。这些将是我的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);
}

游戏thead

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

1 个答案:

答案 0 :(得分:0)

使用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);
   }
}

此时,两个线程中只有一个可以执行代码,而另一个将阻塞。请注意,它们必须在同一个锁定对象上同步