2016-06-21 8 views
-1

2つの空のWhileループがあり、ユーザーが2つのボタンでアクションを実行するのを待っています。ボタンを押すと、while条件に使用されたブール値がtrueに設定され、プログラムが進行します。私はisSendButtonPressedがtrueに設定されているボタンを、「送信」を押したときに、そうJava:ループ中に空でチェックされていない条件?

public class test { 
    static JButton send = new JButton("Send"); 
    static JButton yes = new JButton("Yes"); 
    static boolean isSendButtonPressed = false; 
    static boolean isYesButtonPressed = false; 
    //... 

    public static void main(String[] args) { 
     send.addActionListener(new sendListener()); 
     yes.addActionListener(new yesListener()); 
     //... 
     while (!isSendButtonPressed) {} //works 
     System.out.println("Send button pressed"); 
     while (!isYesButtonPressed) {} //doesn't work 
     System.out.println("Yes button pressed"); 

} 

class sendListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     test.isSendButtonPressed = true; 
    } 
} 
class yesListener implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     test.isYesButtonPressed = true; 
    } 
} 

、それが文を出力します。

コードは次のようです。しかし、whileループの中に命令(例えば、System.out.println)を置かない限り、「はい」ボタンのためにそれを行いません。私は正直なところ、最初の作品はなぜ、2番目の作品ではないのか、なぜ作品が役に立たないのか分かりません。

+2

これは入力を待つ**恐ろしい**方法です... – Idos

+1

忙しいループをしないでください。あなたがそれらの 'boolean'を揮発性にしても、それはひどく悪い考えです。 mutexの 'Object.wait()'だけを実行し、ボタンハンドラにそのmutexを通知させます。 –

+1

あなたはisYesButtonPressedを(そしてisSendButtonPressed) 'volatile'にする必要があります。 – ControlAltDel

答えて

0

'The Infamous "Unresponsive User Interface"'は、Object.wait()Object.notify()を使用してスレッド間で通信する方法を説明しています。フィールドがそう変更するループ状態が発生することが保証されていないUIスレッドで不揮発booleanフィールドを変更する、volatileない限り

は、Javaメモリモデルは、フィールドの変更は表示されないようにでき、両方のスレッドが取得終わるまで/ロックを解除する。

+0

ありがとうございました。ブール値をvolatileに設定すると、今度は正常に機能します。空のwhileループはバッテリーを大量に消費しますか?それは単なる個人的なアプリであり、何も重要ではありません。 – Zezombye

+0

@Zezombye、[この記事]の忙しいルーピングセクションを参照してください(https://software.intel.com/en-us/articles/benefitting-power-and-performance-sleep-loops) –

+0

また、 System.outに書き込むよりも複雑なことをするなら、たぶんいくつかの共有オブジェクトを同期させる必要があります。 –

関連する問題