我有一个可运行的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。但是,当触发action-event时,它会将flag设置为false,忽略我的线程变量。我该如何解决这个问题?
由于
答案 0 :(得分:7)
这里的关键部分是跨不同线程的变量可见性。在没有同步的情况下,编译器,处理器和运行时可以对操作似乎执行的顺序做一些彻头彻尾的奇怪事情。
因此,在volatile
变量上使用flag
修饰符可确保对变量的更新可预测地传播到其他线程。
查看Swing中并发的Initial Threads部分。确保在Event Dispatcher Thread中使用invokeLater或invokeAndWait运行UI更新。这可以让您更清楚地了解Swing中涉及的不同线程。