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,如果我按下按钮,它将打印出短语“Success”,直到我再次按下按钮。使用 Java 7 注册按钮被按下并且 state 的值更改为 true,但永远不会打印短语“Success”。这是怎么回事?

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 回答