gpt4 book ai didi

java - 线程之间的共享内存未更新

转载 作者:行者123 更新时间:2023-12-01 18:38:20 26 4
gpt4 key购买 nike

我面临一个问题,两个线程正在访问共享变量,但无法查看最后的更改。

我有一个 GUI 线程,它有一个文本框、一个鼠标单击监听器,一旦记录单击,就会创建一个新线程,将值注入(inject)文本框,当调用第二次鼠标单击时,最后创建的线程将停止并且将创建一个新的,该新的也将注入(inject)值等等..

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内存模型如何缺失的技术信息。

最佳答案

一些观察结果:

  • 您必须使 isRunningcanRun 都为 volatile 才能使其正常工作

  • 由于您的其他线程仅每 1000 毫秒检查一次 canRun,因此在处理 GUI 线程上对 mouseDoubleClick 的第二次调用之前,您可能仍有很长的延迟。

  • 让线程使用

    进行忙等待通常是一个非常糟糕的主意

    while(true){/*什么都不做*/}循环。你绝对应该使用wait/notify机制而不是在线程之间同步

关于java - 线程之间的共享内存未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20873420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com