Как сказал @Tagir_Valeev
, планировщик окон не так уж и хорош, это одна из основных причин, по которой я думаю.
Другая причина в том, что есть logger.info()
между двумя временными точками, что может потребоваться до нескольких миллисекунд.
Итак, напишите вашу программу следующим образом, чтобы сделать ее более точной.
SleepAccuracyTest.java: (TestNG
класс, используйте Slf4j
в качестве регистратора) результат
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.Assert;
import org.testng.annotations.Test;
// test sleep accuracy,
public class SleepAccuracyTest {
public static final int MAX_DIFF = 1; // max diff in milliseconds,
private Logger logger = LoggerFactory.getLogger(SleepAccuracyTest.class);
private int counter = 0;
@Test(invocationCount = 10, alwaysRun = true)
public void testIt() {
int during = 1000;
counter++;
try {
logger.info("Started [{}]", counter);
logger.info("No Arguments passed waiting for {} milliseconds...", during);
long start = System.currentTimeMillis();
Thread.sleep(during);
long end = System.currentTimeMillis();
long actualDuring = end - start;
long diff = actualDuring - during;
Assert.assertTrue(Math.abs(diff) <= MAX_DIFF);
logger.info("Expected during: {}, actual duration: {}, diff: {}", during, actualDuring, diff);
logger.info("Ended\n");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Тест:
На моей машине (64bit Linux-3,16, Java8, 4 cpu):
- При запуске кода он имеет разницу в 1 ~ 6 миллисекунд,
- При запуске моего кода выше, в большинстве случаев он имеет 0 diff, иногда он отличается на 1 миллисекунду (я думаю, 1 миллисекунда просто округляет).
Таким образом, детали logger.info()
или System.out.printf()
также занимают время. Но всего несколько миллисекунд, никогда не секунд.
Я пробовал имитировать это на своем MAC, но я вижу ожидаемый ответ. Я сделал это на своей Mac OS –
Можете ли вы попробовать еще раз? Всегда ли это '55'? –
Не всегда это отличается. Некоторое время он подходит. Я просто хотел понять, что делает Thread.sleep, чтобы быть более точным. –