[英]Shared memory between threads not updating
我面临一个问题,即两个线程正在访问共享变量而无法查看最新更改。
我有一个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内存模型缺失方式的技术信息。
几点观察:
您必须同时使isRunning
和canRun
,以使其工作
由于您的其他线程仅每1000毫秒检查一次canRun
,因此在处理对GUI线程的mouseDoubleClick
的第二次调用之前,您可能仍会canRun
很长时间。
让线程忙于等待通常是一个非常糟糕的主意
while(true){/*do nothing*/}
循环。 您绝对应该使用等待/通知机制来在线程之间同步
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.