在for循環中我通過檢索和處理車輛信息來控制基於模擬步驟的交通模擬器SUMO。爲了確保我的程序在「實時」模擬(1個模擬步驟= 1秒),我想在處理階段之後讓程序進入睡眠狀態,直到下一個時間步驟開始。爲了獲得更好的結果,我正在計算基於最初採用的參考時間戳的時間戳。java中的時間同步
循環是這樣的:
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,
馬庫斯
+1,因爲我認爲這是解決代碼中直接錯誤的唯一答案。 – 2009-09-07 10:40:42
Mhhh,我不確定1000-processingTime是否是我真正想要的,因爲在這種情況下,睡眠時間僅基於最後一步的信息。 使用我的解決方案,我將能夠避免一些漂移問題。但是因爲我對執行開銷沒有任何影響,所以我可能別無選擇,除非使用您的解決方案...或者? – Markus 2009-09-07 10:57:47
唯一的解決方案實際上更接近你想要的是其他評論中的scheduleAtFixedRate - 其中的缺點,如果我正確理解你的問題,是你不能確定一個步驟完成之前,下一個開始(正在運行在不同的線程和所有) - 如果這不是一個問題,那麼一個ScheduledExecutorService將確保每個步驟開始1000毫秒後的前一個 – laura 2009-09-07 11:21:49