Mar*_*819 1 java concurrency multithreading javafx
我正在 JavaFX 中开发应用程序,并且具有以下结构,其中包含在控制器类中创建的对象“config”,然后我从扩展原始控制器类的两个类以及其他线程访问配置。
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我想实现这一点,当我在 StatusController 中调用 getRemainingTime() 或 get Message() 时,我将始终获得写入配置变量中的最新状态。但相反,我仍然获得变量初始化时存储的初始值。
第二个线程每 10 秒运行一次,并始终使用新机器状态更新配置变量。即使我让第二个线程运行几分钟,在 StatusController 中,我总是会获得初始值。
有人可以帮助我如何实现这一目标吗?
小智 6
啊,明白了。看起来您认为 StatusController 和 MainController 访问同一个 Config 实例。但事实并非如此。
StatusController extends Controller
MainController extends Controller
Run Code Online (Sandbox Code Playgroud)
每个控制器都有自己的 Config 对象实例。这意味着 MainController 更改了 MainController 的配置。但 StatusController 有自己的 Config。您需要访问 MainController 的配置并打印其状态。
第二个问题。配置不是线程安全的。由于CPU缓存等原因,您可能看不到线程的变化。您可以使用任何同步概念来解决它。
rzwitserloot - 已经回答了...
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |