Dr.*_*all 2 java events swing multithreading awt
我有一个可运行的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 ...
}
Run Code Online (Sandbox Code Playgroud)
在我的示例中,在线程中初始化构造函数时,flag设置为true.但是,当触发action-event时,它会将flag设置为false,忽略我的线程变量.我该如何解决?
谢谢
这里的关键部分是跨不同线程的变量可见性.在没有同步的情况下,编译器,处理器和运行时可以对操作看起来执行的顺序做一些彻头彻尾的奇怪事情.
因此,volatile在flag变量上使用修饰符可确保对变量的更新可预测地传播到其他线程.
看一下Swing中Concurrency 的Initial Threads部分.确保在事件调度程序线程中运行UI更新,例如使用invokeLater或invokeAndWait.这应该让您更清楚地了解Swing中涉及的不同线程.