java中的时间同步

在for-loop中,我通过检索和处理车辆信息来控制基于模拟步骤的交通模拟器SUMO.为了确保我的程序“实时”模拟(1个模拟步骤= 1秒),我想在处理阶段之后睡眠我的程序,直到下一个步骤开始.为了获得更好的结果,我正在根据最初采用的参考时间戳计算时间戳.

循环看起来像这样:

System.out.println("start of traffic simulation ...");

    for (int i = 0; i < stepCount; i++)
    {
        System.out.println("step: " + i);

        // set before timeStamp
        beforeTimeStamp = System.currentTimeMillis();

        if (firstStep)
        {
            // get reference timeStamp
            referenceTimeStamp = beforeTimeStamp;
            firstStep = false;
        }
        else
        {
            // get next vehicleVector
            vehicleVector = masterControl.traCIclient.simulateStep();
        }

        // process vehicleVector

        // set after timeStamp
        afterTimeStamp = System.currentTimeMillis();

        processingTime = afterTimeStamp - beforeTimeStamp;

        // calculate sleepTime
        sleepTime = referenceTimeStamp + ((i + 1) * 1000) - afterTimeStamp;

       // sleep for sleepTime ms
       Thread.sleep(sleepTime);
    }

    System.out.println("end of traffic simulation ...");

这是一些变量的输出:

step:   0                                                                                                         
beforeTimeStamp 1252317242565                                                                                   
reference time: 1252317242565                                                                                   
processing time: 394                                                                                            
test time: 1252317243565                                                                                        
afterTimeStamp 1252317242959                                                                                    
sleepTime: 606                                                                                                  
step: 1                                                                                                         
beforeTimeStamp 1252317242961                                                                                   
processing time: 665                                                                                            
test time: 1252317244565                                                                                        
afterTimeStamp 1252317243626                                                                                    
sleepTime: 939 (exspected: 1000 - 665 = 335)                                                                                                  

如您所见,睡眠时间仅适用于第一个模拟步骤.我不知道这里可能出现什么问题.有人有想法吗?

BR,

马库斯

解决方法

为什么不睡1000 – 处理时间?这是你能得到正确答案的最接近的答案.

您的解决方案仅适用于第一步,因为它只适用于第一步.您假设您将在referenceTime开始处理每个步骤(步骤* 1000),但您不考虑开销(线程休眠,打印,垃圾收集).打印出referenceTimeStamp((i 1)* 1000) – beforeTimeStamp看看我的意思

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...