сериализация блоков кода между разными потоками - PullRequest
1 голос
/ 06 марта 2012

Я делаю игру на Android, которая будет иметь три темы.Это будет мой поток рендеринга GL, мой поток обновления игры и поток пользовательского интерфейса.

Игра вращается вокруг ArrayList (а также регулярного массива) объектов 'ball'.Пользователь создает шар, нажимая на экран, поток обновления игры перемещает шары по экрану, а поток рендеринга рисует все шары.

Проблема, с которой я столкнулся, связана с проблемой параллелизма, возникающей измногие потоки обращаются к одним и тем же данным, а именно к массиву шаров.В частности, проблема заключается в получении 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 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 голосов
/ 06 марта 2012

Используйте блок 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);
   }
}

На этом этапе только один из двух потоков может выполнить код, а другой заблокирует.Обратите внимание, что они оба должны быть синхронизированы на одном и том же объекте блокировки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...