2012-03-06 3 views
1

3 개의 스레드가있는 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); 
} 
+0

이 코드가 컴파일됩니까? 'int'는'updateBallPosition' 메소드를 가지고 있지 않습니다. – Tudor

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

코드를 실행할 수있는 두 개의 스레드 중 하나, 다른 하나는 차단하면서. 동일한 잠금 객체에 모두 동기화되어야합니다 ().

+0

아, 그래, 좋은 생각이야. 고마워요! –