Java 如何处理线程和awt事件?

Java 如何处理线程和awt事件?,java,multithreading,swing,events,awt,Java,Multithreading,Swing,Events,Awt,我有一个可运行的gui swing类,它在初始化构造函数时设置变量。当gui运行时,它作为自己的独立线程运行。然而,问题是当在gui上触发操作事件时,当我尝试访问初始化的变量时,它们会重置为默认值。经过一些调试后,触发的操作事件似乎以其自身的线程开始。在处理动作事件时,如何在正确的线程中访问正确的变量 示例代码: public class myGui implements Runnable{ private flag = false; public myGui(){

我有一个可运行的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,忽略my threads变量。我该如何解决这个问题


谢谢

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

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


看看Swing中的并发部分。确保用户界面更新在实例中使用或运行。这将使您更清楚地了解Swing中涉及的不同线程。

尝试使变量变为volatile
标志的目的是什么
?您应该向我们展示如何启动线程和构建GUI。Tryyo创建一个SSCCE,并遵守Java命名约定。