[英]How to properly wait until ActionListener is executed?
我有一個簡單的,可變大小的井字游戲應用程序,在不同的計算機上工作方式不同。 在我的筆記本電腦上,它的工作方式就像我想要的那樣,在我的筆記本電腦上,它被卡在實現ActionListener
的ButtonListener
類中。 我很確定這是因為我使用while
循環等待執行動作的方式。 這是令人反感的代碼段。
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循環等待Event翻轉布爾值時是否出錯?如果是,我將如何正確等待它?
不要簡單地使用while(true)
循環。 它將占用您的CPU使用率。 請改用synchronization
。 創建一個private final Object
並在其上調用wait()
。 在此之前,將此對象的引用發送到MessageListener。 在MessageListener中完成操作后,可以在其上調用notify()
。
還要注意虛假喚醒 。
您應該重新設計您的應用程序。 根本不需要等待。 除非有某些事件(即用戶輸入)觸發了此類更改,否則應用程序的整個狀態將不會更改。 對於井字游戲尤其如此。 除非某些用戶輸入以允許的方式更改了狀態,否則您要等待的條件無法變為真。 因此,您可以在條件可能變為真的地方檢查偵聽器內部的條件。 然后立即對其進行反應。
因此,您應該實現對事件做出反應,更改應用程序狀態並返回的偵聽器。 下一個事件發生時將發生下一個狀態轉換,而不是在此之前的單個CPU周期。 如果要進行獨立於用戶生成的事件(即動畫)的更改,請使用Timer
來生成適當的事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.