实现以下代码的正确方法是什么?我想让takeTurn()方法等待玩家点击网格上与他想要选择的棋子对应的按钮。(Button
对象具有实例变量int col, row
和extend JButton
。)
int selectedCol, selectedRow;
void takeTurn() {
System.out.print(name + "'s turn. ");
// Get player to select a piece
selectedCol = -1;
selectedRow = -1;
while (selectedCol == -1 && selectedRow == -1) {
try {
wait(500);
} catch (InterruptedException e) {
}
}
System.out.println(selectedCol + " " + selectedRow);
}
@Override
public void actionPerformed(ActionEvent e) {
Button b = (Button)e.getSource();
selectedCol = b.col;
selectedRow = b.row;
}
运行得到Exception in thread "main" java.lang.IllegalMonitorStateException
。
在Swing或AWT(或大多数UI框架)中,永远不应该阻塞主事件线程。这将导致您的程序停止,并且看起来已崩溃或挂起。
相反,您需要根据传入事件监视程序的状态。
例如。
- 下一个用户转向,休息内部变量
- 用过的点击件。保留对工件的引用
- 使用点击(有些地方)。如果用户选择了一个工件,那么移动是否有效?等等
只有当还有notify()时,wait()才有意义,所以它总是关于线程之间的通信,需要同步才能正常工作。您的代码似乎缺少基本的等待/通知模型实现。
有一个概念的保护块,它说
线程通常必须协调它们的操作。最常见的协调成语是有人防守的块。这样的块开始于轮询一个必须为真的条件,然后块才能进行
点击此处了解更多信息:http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
我在您的代码中没有看到任何synchronization
。对象需要位于synchronized
上下文中,wait()
才能工作。
创建一个thread
并在那里运行代码,然后在那里调用thread.wait()
。