我正在做模拟项目,其中有数百个CPU绑定作业运行10到50毫秒。作业是一个Runnable对象,具有指定的运行时间,作业将使CPU保持忙碌状态。线程池中有10个线程正在等待工作到达。我将请求速率设置为每秒40个请求,并将所有作业运行时间设置为10ms。但结果非常糟糕。所有作业运行至少15ms。没有工作运行10毫秒。我用15ms的工作测试了实验,并得到了正确的结果。为什么10ms作业至少运行15ms?(我正在使用WINDOWS8)。为什么小于15ms的忙等待不一致?
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());
}
}
您的系统计时器的分辨率可能是15ms。你可以尝试['System.nanoTime()'](http://docs.oracle.com/javase/8/docs/api/java/lang/System.html#nanoTime--),但它可能没有更多分辨率。链接的Javadoc说(部分)*除了分辨率至少和currentTimeMillis()一样好,没有任何保证。* –