Подтвердить что ты не робот

Насколько точна Thread.sleep?

Я изучаю компьютерное оборудование, где мы узнаем, что использование аппаратного таймера дает более точные результаты, чем задержка в программном обеспечении. Я написал задержку программного обеспечения в сборке в течение 1 миллисекунды, и я могу начать процесс, который повторяет каждый миллисекун с использованием этой задержки, а счетчик делает что-то еще каждые 100 миллисекунды, и этот метод будет менее точным, чем использование аппаратного таймера, который я получил встроенный с моим оборудованием, который я сейчас буду использовать.

Так интересно, насколько точны сроки, которые встроены в Java? У нас есть System.currentTimeMillis и Thread.sleep, и они могут не использовать аппаратные таймеры, поэтому насколько точны эти встроенные методы Java по сравнению с аппаратным таймером?

4b9b3361

Ответ 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);
}