我正在编写一个GUI游戏,我想等待游戏结束,然后再返回赢家。然而,由于我的游戏经理类与用于实现游戏逻辑和发现胜利的课程是分开的,因此我想知道如何让游戏经理等待,直到其他课程通知其获胜为止,然后继续执行其他的东西。我之前并没有真正使用过多线程,所以我希望有人能够解释我如何实现这一目标。
下面是从游戏管理类的主要一些相关的代码,我已经试过:如何在继续当前线程之前等待事件发生?
...
Game game = new Game(mode);
String winner = game.getWinner();
...
从游戏类:
public Game(Game.Mode mode){
this.board = new Board(7);
window = new BoardFrame(7, 7, mode, board); //Graphical interface
window.setVisible(true);
}
public String getWinner(){
synchronized(board.WINNER){
try {
board.WINNER.wait();
} catch (InterruptedException e) {}
}
return board.WINNER;
}
和董事会类:
public boolean update(int num){
if (isValidMove(CurrentPlayer, num)){
buttonClients.get(positions.get(CurrentPlayer)).clear();
positions.put(CurrentPlayer, num);
board[num] = 1;
buttonClients.get(num).performCallback(CurrentPlayer);
if ((WINNER = isGameFinished())!=""){
//Disable all further inputs
for (int i = 0; i<board.length; i++){
board[i] = 1;
}
synchronized (WINNER) {
WINNER.notify();
}
}
CurrentPlayer = (CurrentPlayer==PLAYER1)?PLAYER2:PLAYER1;
return true;
}
return false;
}
编辑:所以我找到了屏幕显示问题的原因,那就是我所有的GameManager代码都在EventQueue.invokeLater()
块中。现在我已经将它从该块中取出,现在屏幕正常显示。但是,当我打到最后,并且synchronized(WINNER)
块终于运行时,似乎没有任何反应?换句话说,游戏继续等待WINNER
。
我建议以 '甲骨文并发教程'。 –