Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 与Java7不兼容_Multithreading_Java 7_Volatile_Java 6_Incompatibility - Fatal编程技术网

Multithreading 与Java7不兼容

Multithreading 与Java7不兼容,multithreading,java-7,volatile,java-6,incompatibility,Multithreading,Java 7,Volatile,Java 6,Incompatibility,就我个人而言,我无法理解为什么这个程序不能在Java7中工作。在使用Java6时,我运行它没有问题,但在使用Java7时,它就不起作用了 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class HelloWorld implements ActionListener { JButton button; boolean state;

就我个人而言,我无法理解为什么这个程序不能在Java7中工作。在使用Java6时,我运行它没有问题,但在使用Java7时,它就不起作用了

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();
}

}

使用Java6,如果我按下按钮,它将打印出短语“Success”,直到我再次按下按钮。使用Java7注册按钮被按下,状态值被更改为true,但是短语“Success”从未打印出来。发生了什么事?

volatile
添加到字段声明中

如果没有
volatile
,则不能保证字段中的更改在其他线程上可见。

特别是,抖动可以自由地认为主线程上的字段从未更改,允许它在显示JFrame时完全删除

 frame.setVisible(true); 
Java将显示窗口并停止此行的执行

您已将窗口配置为在关闭时退出:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
关闭窗口后,此程序将终止


因此,
init()
调用之后的代码将永远不会执行。

非常感谢!就这样。这是Java7的一个新特性吗?我必须承认,我对Java的知识完全是自学的,所以我可以对很多事情一无所知,但我以前从未见过这个术语。@user1630640:No;这可能是抖动的变化。如果您想进行多线程开发,我建议您在实践中阅读Java并发。如果没有,则应坚持使用Swing worker螺纹。多线程很难。他已经在
init()
中做到了这一点。而且,
setVisible()
永远不会停止执行。该行只是防止JVM在主线程停止时终止。他其实根本不需要它。如果我关上窗户,那是真的,但我不需要。初始化帧并添加按钮(在init()方法中发生)后,下一个要处理的是while循环(只要我不关闭窗口)。基本上,当JFrame打开时,while循环将永久运行。我的问题是if语句在while循环中不起作用。