1

我正在做模拟项目,我有数百个 CPU 密集型作业运行 10 到 50 毫秒。Job 是一个 Runnable 对象,具有指定的运行时间,作业将使 CPU 保持忙碌。有 10 个线程在线程池中等待作业到达。我将请求速率设置为每秒 40 个请求,所有作业的运行时间设置为 10 毫秒。但结果太可怕了。所有作业至少运行 15 毫秒。没有运行 10 毫秒的作业。我用 15ms 的工作测试了实验,我得到了正确的结果。为什么 10 毫秒的作业至少运行 15 毫秒?(我使用的是 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());
}
}
4

1 回答 1

1

在许多系统(特别是 Windows,IIRC)上,System.currentTimeMillis()由仅精确到 15 毫秒左右的时钟支持。

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

如果要测量经过的时间,切勿使用currentTimeMillis(). 改为使用System.nanoTime()。作为奖励,在大多数系统上,它的调用成本也大大降低,而且更准确。

于 2015-11-14T01:43:35.877 回答