我正在做模擬項目,其中有數百個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()一樣好,沒有任何保證。* –