0

实现以下代码的正确方法是什么?我想让 takeTurn() 方法等待玩家点击网格上与他想要选择的棋子相对应的按钮。(Button对象有实例变量int col, rowextend 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

4

3 回答 3

3

在 Swing 或 AWT(或大多数 UI 框架)中,您永远不应该阻塞主事件线程。这将导致您的程序停止并看起来已经崩溃或挂起。

相反,您需要根据传入事件监视程序的状态。

例如。

  • 下一个用户轮流,休息内部变量
  • 使用点击片。保持对作品的引用
  • 使用点击(某些地方)。如果使用选择了一块,移动是否有效?ETC...
于 2013-07-01T05:32:39.143 回答
1

wait() 仅在还有 notify() 时才有意义,因此它始终与线程之间的通信有关,并且需要同步才能正常工作。您的代码似乎缺少基本的等待/通知模型实现。

有一个Guarded block的概念,它说

线程通常必须协调它们的动作。最常见的协调习语是保护块。这样的块首先轮询一个条件,该条件在块可以继续之前必须为真

在此处了解更多信息:http: //docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html

于 2013-07-01T05:32:29.803 回答
0

synchronization我在您的代码中没有看到任何内容。对象需要在synchronized上下文中才能wait()工作。

创建一个thread并在那里运行您的代码并在那里调用thread.wait()

于 2013-07-01T05:28:09.697 回答