You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:35:07