2

下記参照:

/これが私のメインです/

package br.com.general;

public class Main {

    public static void main(String[] args) {

        Wind w = new Wind();
        w.start();

        while(true){
            //System.out.printf("%b\n", w.button());
            if(w.button()){
                System.out.printf("xx %b\n", w.button());
            }
        }

    }

}

/これはボタンが 1 つある私の JFrame ウィンドウです/

package br.com.general;

import javax.swing.JButton;
import javax.swing.JFrame;

public class Wind extends JFrame{

    private static final long serialVersionUID = 1L;
    Act a = new Act();

    public Wind() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        JButton B = new JButton("on");

        getContentPane().setLayout(null);  

        B.setBounds(10, 10, 50, 30);
        B.addActionListener(a);

        add(B);
        setSize(100, 100);
    }

    public void start() {
        setVisible(true);
    }
    public boolean button(){
        return(a.button());
    }
    public void buttonOk(){
        a.zero();
    }
}

/* そして最後に、これはボタンの ActionListener です */

package br.com.general;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Act implements ActionListener {
    boolean s;
    public void actionPerformed(ActionEvent ae) {
        s = true;

    }
    public boolean button(){
        return(s);
    }
    public void zero(){
        s = false;
    }
}

実行すると機能しないことがわかりますが、メインで「//」を削除して「System.out.printf("%b\n", w.button()」という行を有効にすると、 );" それは機能し始めます....なぜですか?誰かが私を助けることができますか?

4

2 に答える 2

0

すべてのリソースを消費するハード無限ループがあるようです。おそらく、ループに小さな遅延 (例: 10 ~ 100 ミリ秒) を挿入する必要があります。これは Thread.wait() メソッドを使用して実行できます。あなたの場合、コンソール出力が非常に遅いため、遅延は System.out.printf() によって生成されます。

于 2012-09-30T23:27:38.773 に答える
0

これはとても良い質問です!System.out.println(…)理想的な世界では、最初のコードがコメントアウトされているかどうかに関係なく、コードは問題なく実行されます。

問題は、Java がコードを最適化し、クラス内のフラグの現在の値を常に取得するとは限らないことです。sAct

この (この場合は間違った) 最適化を回避するには、volatile修飾子:を使用できますvolatile boolean s;。これには、JVM が常にメモリから実際の値を取得し、それをキャッシュしないようにする必要があります。 Java チュートリアルのAtomic Access を参照してください。

于 2012-09-30T23:21:44.323 に答える