【发布时间】:2014-01-01 21:23:31
【问题描述】:
我面临一个问题,即两个线程正在访问共享变量而无法查看最后的更改。
我有一个 GUI 线程,它有一个文本框,一个鼠标点击监听器,一旦记录了一次点击,就会创建一个新线程,它将值注入文本框,当第二次鼠标点击被调用时,最后创建的线程将被停止并且将创建一个新的,它也将注入值等等..
public class SomeGuiClass{
private static boolean isRunning = false;
private static boolean canRun = true;
private Thread thread;
public SomeGuiClass(){
txt.addMouseListener(new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent arg0) {
if (isRunning){
// force the thread to stop running.
canRun = false;
// waits for the thread to stop his run.
while(isRunning);
}
thread = new Thread(new Runnable() {
@Override
public void run() {
SomeGuiClass.isRunning = true;
while(SomeGuiClass.canRun){
// Inject values to text box, using Display.asyncExec...
Thread.sleep(1000);
}
SomeGuiClass.isRunning = false;
}
});
SomeGuiClass.canRun = true;
thread.start();
}
}
}
}
问题是读取isRunning的GUI线程看不到新线程执行的最后一次更新,导致while(isRunning)循环永远运行。
我尝试使用 volatile 并发生同样的事情。看来我的做法在逻辑上是对的,只是缺少有关 java 内存模型如何缺失的技术信息。
【问题讨论】:
-
如果你像我描述的那样使用
volatile,它应该永远解决你的gui线程循环问题。请查看我在回答中添加的其他注释,希望对您有用。
标签: java multithreading static volatile