对于我的生活,我无法弄清楚为什么这个程序在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注册按下按钮并将状态值更改为true,但永远不会打印短语“Success”。发生了什么事?
答案 0 :(得分:4)
将volatile
添加到字段声明中。
如果没有volatile
,则无法保证字段中的更改在其他线程上可见
特别是,JITter可以自由地相信该字段永远不会在主线程上发生变化,从而允许它完全删除if
。
答案 1 :(得分:0)
当您显示JFrame
时 frame.setVisible(true);
Java显示窗口并停止此行的执行。
您将窗口配置为在关闭时退出:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
关闭窗口后,此程序将终止。
因此init()
调用后的代码永远不会被执行。