Насколько точна Thread.sleep?
Я изучаю компьютерное оборудование, где мы узнаем, что использование аппаратного таймера дает более точные результаты, чем задержка в программном обеспечении. Я написал задержку программного обеспечения в сборке в течение 1 миллисекунды, и я могу начать процесс, который повторяет каждый миллисекун с использованием этой задержки, а счетчик делает что-то еще каждые 100 миллисекунды, и этот метод будет менее точным, чем использование аппаратного таймера, который я получил встроенный с моим оборудованием, который я сейчас буду использовать.
Так интересно, насколько точны сроки, которые встроены в Java? У нас есть System.currentTimeMillis
и Thread.sleep
, и они могут не использовать аппаратные таймеры, поэтому насколько точны эти встроенные методы Java по сравнению с аппаратным таймером?
Ответы
Ответ 1
Thread.sleep()
является неточным. Как неточно зависит от базовой операционной системы и ее таймеров и планировщиков. Я испытал, что сбор мусора, идущий параллельно, может привести к чрезмерному сну.
При выполнении симуляций "реального времени" вы должны исправить свой основной цикл для неточностей sleep
. Это можно сделать, вычисляя ожидаемое время пробуждения и сравнивая это с фактическим временем пробуждения и корректируя разницу в следующем цикле.
Если вам нужна более высокая производительность, посмотрите на Java спецификацию системы реального времени. Я не использовал его сам, поэтому я не могу предоставить более подробную информацию.
Ответ 2
Из спецификации языка Java.
Thread.sleep заставляет текущий исполняемый поток спать (временно прекратить исполнение) на указанную продолжительность, при условии точность и точность системных таймеров и планировщиков. Нить не утрачивает права собственности на какие-либо наблюдатели и возобновление исполнения будет зависеть от планирования и доступности процессоров, на которых для выполнения потока.
Ответ 3
Я не нашел Thread.sleep точным. Фактически, я обнаружил, что он, кажется, спит меньше, чем он promises.
Результаты при настройке на спящий режим 1 миллисекунда:
********* Average elapsed time = 957 micro seconds
Ниже мой тест:
public static void main(String[] args) throws InterruptedException {
List<Long> list = new ArrayList<Long>();
int i= 0;
while(i <=100){
long authStartTime = System.nanoTime();
Thread.sleep(1);
long elapsedTime = System.nanoTime() - authStartTime;
System.out.println("*****"+elapsedTime/1000+ " mics");
list.add(elapsedTime);
i++;
}
long sum=0;
for(long l : list){
sum = sum + l;
}
System.out.println("********* Average elapsed time = "+sum/list.size()/1000+" micro seconds");
System.exit(0);
}