3

私の人生では、このプログラムが Java 7 で動作しない理由を理解できません。Java 6 を使用して問題なく実行しましたが、Java 7 で実行するとすぐに動作しません。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class HelloWorld implements ActionListener {

JButton button;
boolean state;

public HelloWorld(){
    init();
    state = false;
    System.out.println("state - "+state);

    while (true){
        if (state == true){
            System.out.println("Success");
        }
    }
}

private void init(){
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    button = new JButton("Button");
    button.addActionListener(this);
    frame.add(button);
    frame.pack();
    frame.setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
    JButton source = (JButton)e.getSource();

    if (source == button){
        state = !state;
        System.out.println("state - "+state);
    }
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    new HelloWorld();
}

}

Java 6 を使用してボタンを押すと、もう一度ボタンを押すまで「成功」というフレーズが出力されます。Java 7 を使用すると、ボタンが押され、状態の値が true に変更されたことが登録されますが、「成功」というフレーズは出力されません。どうしたの?

4

2 に答える 2

4

volatileフィールド宣言に追加します。

がないvolatileと、フィールドの変更が他のスレッドで表示されることが保証されません。
特に、JITter はフィールドがメイン スレッドで変更されないと自由に信じて、if完全に削除することができます。

于 2012-10-10T01:18:21.430 に答える
0

JFrameを表示すると

 frame.setVisible(true); 

Java ウィンドウを表示し、この行で実行を停止します。

閉じるときに終了するようにウィンドウを構成しました。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ウィンドウを閉じると、このプログラムは終了します。

したがって、呼び出し後のコードはinit()実行されません。

于 2012-10-10T01:29:28.190 に答える