2013-04-19 29 views
0

我在线程的run()方法中遇到了一个非常奇怪的异常。简单语境中的Java异常

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,但系统不会打印任何结果。这是一个更大的类的一部分,它是我正在开发的游戏的基类。然而,这让我完全陷入困境,我不明白为什么这不起作用。如果不是gameStarted,我把true放在if语句中,它确实打印出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

Mark gameStarted as'volatile'? – phs

回答

0

我认为问题是,有你的线程中是不多见的由变量“gameStarted”(竞赛条件)上的主线程进行的更新。如果你将变量gameStarted设置为“volatile”,它是否有所作为?我认为使其变得易变可以确保你的线程将看到最新的值,在这种情况下,它是由主线程设置的“真”。

+0

将gameStarted设置为volatile会起作用。但是,如果你看看我的第二个例子,它的工作原理与在if语句之前添加另一个println完全相同。如果你说的是正确的,那么在if之前有一个println语句允许gameStarted在它到达if语句时呈现为真... – fvgs

+0

是的,我相信如此。但我不会依赖if语句之前的额外println来解决时序问题,而是使变量变得不稳定。 – GJ13