【发布时间】:2014-03-19 10:55:15
【问题描述】:
我有一个简单、大小可变的井字游戏应用程序,它在不同机器上的工作方式不同。在我的笔记本电脑上,它像我想要的那样工作,在我的桌面上,它卡在实现ActionListener 的ButtonListener 类中。我很确定这是因为我使用while 循环等待执行操作的方式。这是有问题的代码sn-p。
public void playOneTurn(int player) {
waiting = true;
while (waiting) {
// Do nothing, touchEvent will change waiting.
}
}
我的意思是让这个方法简单地等待一个有效的位置被选中,然后waiting 被翻转到ButtonListener:
class ButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("TOUCHEVENT");
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
if (e.getSource() == cells[i][j]) {
if (model[i][j] == 'e') {
cells[i][j].setText("");
currentSpot[0] = i;
currentSpot[1] = j;
if (count % 2 == 0) {
cells[i][j].setBackground(Color.GREEN);
cells[i][j].setIcon(X_MARK);
model[i][j] = 'x';
count++;
waiting = false;
} else {
cells[i][j].setBackground(Color.CYAN);
cells[i][j].setIcon(O_MARK);
model[i][j] = 'o';
count++;
waiting = false;
}
} else {
System.out.println("Hey, you can't move there silly!");
}
}
}
}
我对线程一无所知,但我相信ButtonListener 正在启动一个线程,并且由于我等待它的方式,使用while 循环,线程永远不会停止让其余的我的代码在某些机器上运行。
我在使用 while 循环等待事件来翻转布尔值时是否出错,如果是,我将如何正确等待它?
【问题讨论】:
-
启动一个单独的线程来运行
playOneTurn,并将Thread.sleep()放入你的循环中,以节省cpu 周期 -
不同的行为可能是因为
waiting可能没有声明为volatile:当一个线程改变它的值时,另一个线程不一定查看新值(除非变量是volatile或存在同步形式)。但正如已经指出的那样:您在那里所做的事情被称为“忙着等待”,通常是一种不好的做法,应该用synchronized、wait()和notifyAll()代替。
标签: java multithreading swing awt actionlistener