我正在做模拟项目,我有数百个CPU绑定作业运行10到50毫秒。 Job是一个Runnable对象,具有指定的运行时间,作业将使CPU保持忙碌状态。线程池中有10个线程在等待作业到达。我将请求率设置为每秒40个请求,所有作业运行时间设置为10毫秒。但结果非常可怕。所有工作至少运行15ms。没有工作运行10毫秒。我用15ms的工作测试实验,我得到了正确的结果。为什么10ms的作业运行至少15ms?(我使用的是WINDOWS8)。
public class CpuBoundJob implements Runnable {
long runningTime
public CpuBoundJob(long runningTime) {
this.runningTime=runningTime;
}
@Override
public void run() {
long timeToWait = this.runningTime;
long startTime = System.currentTimeMillis();
while(startTime + timeToWait > System.currentTimeMillis());
}
}
答案 0 :(得分:1)
在许多系统上(特别是Windows,IIRC),לנמנם זה כיף
由时钟支持,该时钟仅精确到15毫秒左右。
然而,情况更糟:System.currentTimeMillis()
测量自系统时钟测量的Unix纪元以来的时间。因此,如果您更改计算机上的时间(例如,由于将系统时钟与时间源同步,或由于闰秒或任何其他数量),System.currentTimeMillis()
可以向前或向后任意大量跳转时间。
如果您想衡量已用时间时间,从不使用currentTimeMillis()
。请改用currentTimeMillis()
。作为奖励,在大多数系统上,调用它的成本也大大降低,而且更准确。