繁体   English   中英

从多个线程访问同一个对象实例

[英]Accessing the same object instance from multiple Threads

我正在使用 JavaFX 开发应用程序,并且我具有以下结构,其中包含在 Controller 类中创建的对象“config”,然后我从扩展原始 Controller 类的两个类以及其他线程访问配置。

public class Controller {

    protected Config config = new Config();

    private void setupConfig() {
        var machineStatus = new MachineStatus();
        machineStatus.setRemainingTime(25);
        machineStatus.setMessage("Running");
        config.setMachineStatus(machineStatus);
    }
}


public class MainController extends Controller {
    Thread taskThread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true) {
                        var newStatus = getNewStatus();          // Returns new status containing different RemainingTime and Message value every time
                        config.setMachineStatus(newStatus);
                        Thread.sleep(10000);
                    }
                }
    });
    taskThread.start();
}


public class StatusController extends Controller {
    System.out.println(config.getMachineStatus().getRemainingTime()) // Always prints 25
    System.out.println(config.getMachineStatus().getMessage())      // Always prints "Running"
}


public class Config {
    private MachineStatus machineStatus;

    public MachineStatus getMachineStatus() {
        return machineStatus;
    }

    public void setMachineStatus(MachineStatus value) {
        machineStatus = value;
    }
}

public class MachineStatus {
    private int remainingTime;
    private String message;

    public int getRemainingTime() {
        return remainingTime;
    }

    public void setRemainingTime(int value) {
        remainingTime = value;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String value) {
        message = value;
    }
}

我想实现这一点,当我在 StatusController 中调用 getRemainingTime() 或获取 Message() 时,我将始终获得写入配置变量的最新状态。 但相反,我仍然得到初始化变量时存储的初始值。

第二个线程每 10 秒运行一次,并始终使用新机器状态更新配置变量。 即使我让第二个线程运行几分钟,在 StatusController 中,我总是得到初始值。

有人可以帮助我如何实现这一目标吗?

啊,明白了。 看起来您认为 StatusController 和 MainController 访问的是同一个 Config 实例。 但它不是那样工作的。

StatusController extends Controller
MainController extends Controller

每个控制器都有自己的 Config 对象实例。 这意味着 MainController 更改了 MainController 的配置。 但是 StatusController 有自己的 Config。 您需要访问 MainController 的配置并打印它们的状态。

第二个问题。 配置不是线程安全的。 由于 CPU 缓存等原因,您可能看不到线程的变化。您可以使用任何同步概念来解决它。

rzwitserloot - 已经回答...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM