为什么不到15ms的忙等待是不一致的?

时间:2015-11-14 01:30:14

标签: java multithreading busy-waiting busy-loop

我正在做模拟项目,我有数百个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());
}
}

1 个答案:

答案 0 :(得分:1)

在许多系统上(特别是Windows,IIRC),לנמנם זה כיף 由时钟支持,该时钟仅精确到15毫秒左右。

然而,情况更糟:System.currentTimeMillis()测量自系统时钟测量的Unix纪元以来的时间。因此,如果您更改计算机上的时间(例如,由于将系统时钟与时间源同步,或由于闰秒或任何其他数量),System.currentTimeMillis()可以向前或向后任意大量跳转时间。

如果您想衡量已用时间时间,从不使用currentTimeMillis()。请改用currentTimeMillis()。作为奖励,在大多数系统上,调用它的成本也大大降低,而且更准确。