2

我有一个可运行的 gui swing 类,它在初始化构造函数时设置我的变量。当 gui 运行时,它作为自己的单独线程运行。然而,问题是当我的 gui 上触发一个动作事件时,当我尝试访问我的初始化变量时,它们被重置为默认值。经过一些调试,触发的动作事件似乎开始作为它自己的线程。在处理我的动作事件时,如何在正确的线程中访问正确的变量?

示例代码:

public class myGui implements Runnable{
    private flag = false;
    public myGui(){
        flag = true;
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    System.out.println("The value of flag is: " + flag); // prints flag is false
    }
    public void run(){
        // Do stuff
    }
    // More code ...
}

在我的示例中,在线程中初始化构造函数时,flag 设置为 true。但是,当触发动作事件时,它会看到标志设置为 false 忽略我的线程变量。我该如何解决?

谢谢

4

1 回答 1

7

这里的关键部分是跨不同线程的变量的可见性。在没有同步的情况下,编译器、处理器和运行时可以对操作执行的顺序做一些非常奇怪的事情。

因此,在变量上使用volatile修饰符flag以确保对变量的更新可预测地传播到其他线程。

查看 Swing 中并发的初始线程部分。确保 UI 更新在Event Dispatcher 线程中运行,例如使用invokeLaterinvokeAndWait。这应该让您更清楚地了解 Swing 中涉及的不同线程。

于 2013-01-09T20:28:59.807 回答