在for循环中,我通过检索和处理车辆信息来控制基于仿真步骤的交通模拟器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 ...");
以下是一些变量的输出结果:
步骤:0 beforeTimeStamp 1252317242565 参考时间:1252317242565 处理时间:394 测试时间:1252317243565 afterTimeStamp 1252317242959 sleepTime: 606如您所见,睡眠时间仅对第一个模拟步骤正确。我不知道可能出了什么问题。有人有想法吗?
步骤:1 beforeTimeStamp 1252317242961 处理时间:665 测试时间:1252317244565 afterTimeStamp 1252317243626 sleepTime: 939(预期值:1000-665 = 335)
敬礼,
Markus
sun.misc.Unsafe
类?为什么不在Stack Overflow上提出另一个问题呢?那里肯定会有答案! - oxbow_lakes