簡體   English   中英

如何正確等待ActionListener執行?

[英]How to properly wait until ActionListener is executed?

我有一個簡單的,可變大小的井字游戲應用程序,在不同的計算機上工作方式不同。 在我的筆記本電腦上,它的工作方式就像我想要的那樣,在我的筆記本電腦上,它被卡在實現ActionListenerButtonListener類中。 我很確定這是因為我使用while循環等待執行動作的方式。 這是令人反感的代碼段。

public void playOneTurn(int player) {
    waiting = true;
    while (waiting) {
        // Do nothing, touchEvent will change waiting.
    }
}

我的意思是,此方法只需要等待選擇一個有效位置並waitingButtonListener翻轉:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM