作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个可运行的 gui swing 类,它在初始化构造函数时设置我的变量。当 GUI 运行时,它作为自己的单独线程运行。然而问题是,当我的 gui 上触发操作事件时,当我尝试访问已初始化的变量时,它们将重置为默认值。经过一些调试后,似乎触发的 Action 事件是作为它自己的线程开始的。在处理操作事件时,如何在正确的线程中访问正确的变量?
示例代码:
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,忽略我的线程变量。我该如何解决这个问题?
谢谢
最佳答案
这里的关键部分是跨不同线程的变量的可见性。在没有同步的情况下,编译器、处理器和运行时可能会对操作的执行顺序执行一些完全奇怪的事情。
因此,请在 flag
变量上使用 volatile
修饰符,以确保对变量的更新可预测地传播到其他线程。
看看Initial Threads Swing 中的并发部分。确保 UI 更新在 Event Dispatcher Thread 中运行例如 invokeLater或invokeAndWait 。这应该可以让您更清楚地了解 Swing 中涉及的不同线程。
关于java - 如何使用线程和 awt-events?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245702/
我是一名优秀的程序员,十分优秀!