2013-04-19 2 views
0

스레드의 run() 메소드에서 매우 이상한 예외가 발생했습니다.간단한 문맥의 Java Anomaly

public class project extends JApplet implements KeyListener, MouseListener, MouseMotionListener, ActionListener, Runnable { 
    private boolean gameStarted; 
    public void init() { 
    gameStarted = true; 
    new Thread(this).start(); 
    } 
    public void run() { 
    while (true) { 
     if (gameStarted) 
      System.out.print("OK"); 
    } 
    } 
} 

변수 gameStarted는 true이지만 시스템은 아무 것도 인쇄하지 않습니다. 이것은 내가 작업하고있는 게임의 기본 클래스 인 더 큰 클래스의 일부입니다. 그러나, 이것은 완전히 난처한 상황이며 왜 이것이 작동하지 않는지 이해할 수 없습니다. if 문에 gamestarted 대신 true을 입력하면 OK가 출력됩니다.

또한 내가 다음에 run() 메소드를 변경하는 경우, 그것은 gameStarted이 참 주어진 예상대로 정확하게 작동주의 :

public void run() { 
    while (true) { 
     System.out.print(gameStarted); 
     if (gameStarted) 
      System.out.print("OK"); 
    } 
    } 
+1

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+0

컴파일 가능한 코드를 작성하십시오 – Drogba

+1

마크 게임 '휘발성'으로 시작 하시겠습니까? – phs

답변

0

나는 문제가 스레드가이보고되지 않는 것입니다 생각 메인 스레드가 만든 변수 "gameStarted"(경쟁 조건)에 대한 업데이트. 변수 gameStarted를 "휘발성"으로 설정하면 차이가 있습니까? 나는 휘발성으로 만드는 것이 당신의 스레드가이 경우에 메인 스레드가 설정 한 "true"인 최신 값을 볼 수있게 할 것이라고 생각한다.

+0

gameStarted를 volatile로 설정하면됩니다. 그러나 제 2 예제를 보면 if 문 앞에 다른 println을 추가하여 예상대로 작동합니다. 만약 당신이 말하는 말이 맞다면 if 앞에 println 문을 쓰면 if 문에 도착했을 때 gameStarted가 true로 렌더링 될 수 있습니다 ... – fvgs

+0

예, 그렇게 생각합니다. 하지만 타이밍 문제를 해결하고 오히려 변수를 휘발성으로 만들기 위해 if 문 앞에 여분의 println을 사용하지 않을 것입니다. – GJ13