类A静态变量CloudMakespan在类B中取值为0的问题求助
问题分析
你在类A中声明了public static double CloudMakespan供类B访问,但由于类B的doSomeCalCul()会在CloudMakespan通过CalculCloudMakespan()完成赋值前被调用,且无法调整调用顺序,导致类B中获取到的是静态变量的初始值0。
解决方案
针对这种无法调整调用顺序的场景,提供三种实用处理方式:
1. 回调机制
让类B注册回调逻辑,等CloudMakespan计算完成后再触发计算:
- 修改类B,增加回调接口与触发逻辑:
class B { private double totalMakespan; private double tasksMakespan; // 定义回调接口 @FunctionalInterface public interface MakespanReadyCallback { void onMakespanReady(double cloudMakespan); } // 注册回调,若CloudMakespan已赋值则立即执行,否则等待后续触发 public void registerMakespanCallback(MakespanReadyCallback callback) { if (A.CloudMakespan != 0) { callback.onMakespanReady(A.CloudMakespan); } } // 实际计算逻辑 private void calculateTotalMakespan(double cloudMakespan) { totalMakespan = cloudMakespan + tasksMakespan; // 此处可添加计算完成后的业务逻辑 } }
- 在类A的main方法中完成赋值后触发回调:
public static void main(String[] args){ Cloudsim.startSimulation(); Cloudsim.EndSimulation(); CloudMakespan = CalculCloudMakespan(); // 假设已创建B类实例b b.registerMakespanCallback(cloudMs -> b.calculateTotalMakespan(cloudMs)); }
2. 延迟检查获取
修改类B的计算逻辑,每次执行时检查CloudMakespan是否完成赋值,未完成则短暂等待(需设置超时避免无限阻塞):
class B { private double totalMakespan; private double tasksMakespan; public double doSomeCalCul() { // 设置5秒超时,可根据模拟实际时长调整 long timeout = System.currentTimeMillis() + 5000; while (A.CloudMakespan == 0 && System.currentTimeMillis() < timeout) { try { Thread.sleep(100); // 每隔100毫秒检查一次 } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } } totalMakespan = A.CloudMakespan + tasksMakespan; return totalMakespan; } }
3. 利用CloudSim事件监听
CloudSim基于事件驱动运行,可监听模拟结束事件,在事件回调中完成CloudMakespan赋值并触发类B的计算:
- 自定义模拟结束事件监听器:
public class SimulationEndListener implements EventListener { private B bInstance; public SimulationEndListener(B b) { this.bInstance = b; } @Override public void processEvent(Event ev) { if (ev.getType() == CloudSimEvents.SIMULATION_END) { A.CloudMakespan = A.CalculCloudMakespan(); bInstance.doSomeCalCul(); // 确保赋值完成后再执行计算 } } }
- 在类A的main方法中注册监听器:
public static void main(String[] args){ B b = new B(); CloudSim.addOnEventListener(new SimulationEndListener(b)); Cloudsim.startSimulation(); }
这种方式贴合CloudSim运行机制,能精准控制执行顺序。
内容的提问来源于stack exchange,提问作者Mohammed El-Amine ghomari
相关产品推荐
相关产品推荐

