Java - альтернатива thread.sleep

У меня есть требование приостановить цикл while на определенное количество миллисекунд. Я пытался использовать Thread.sleep(продолжительность), но это не точно, особенно в цикле. Точность в миллисекундах важна в моей программе.

Вот алгоритм, по которому я не хочу возвращаться, чтобы проверить состояние до expectedElapsedTime прошел мимо.

while (condition) {
    time = System.currentTimeMillis();
    //do something
    if (elapsedTime(time) < expectedElapsedTime) ) {
        pause the loop  // NEED SUBSTITUTE FOR Thread.sleep()
    }
    // Alternative that I have tried but not giving good results is 
    while ((elapsedTime(time) < expectedElapsedTime)) {
        //do nothing
    }
}

long elapsedTime(long time) {
   long diff = System.currentTimeMillis() - time;
   return diff;
}

8 ответов

Попробуйте ScheduledThreadPoolExecutor. Предполагается, что результаты будут более надежными.

Что вы ожидаете?

Если вы перейдете в спящий режим, то после того, как ваш процесс снова запустится, ему придется ждать, пока планировщик потока не запланирует его снова.

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

Вы ничего не можете сделать, чтобы контролировать это, поэтому вы не можете иметь точность, которую вы говорите.

Для вашего случая я бы предложил вращающуюся петлю.

long now = System.currentTimeMillis();   
while(now < expectedElapsedTime){
    now = System.currentTimeMillis();
}

Java не является системой реального времени, вы не можете заставить поток уйти и вернуться в столь сжатые сроки. Чтобы запланировать выполнение вашей программы до миллисекунды, вам нужно использовать другую платформу - например, simpleRTJ или расширение Java Real-Time.

Задержка может быть выбрана произвольно, поэтому я бы поставил под сомнение вашу потребность в интервале времени в реальном времени.

Если вам нужно время чтения, вы должны быть заняты и ждать, пока время не достигнуто. Отказ от процессора означает, что вы не можете гарантировать, что получите его обратно именно тогда, когда захотите.

Решение состоит в том, чтобы использовать обработчик с работоспособным и использовать метод postDelayed. Пример:

new Handler().postDelayed(new Runnable() {
public void run () {
    // Do delayed stuff!
}
}, 5000L); //5 seconds delay 

/questions/15540980/alternativa-metodu-threadsleep-v-android/15540993#15540993

Вы могли бы реализовать механизм ожидания / уведомления и передать другому потоку ответственность за уведомление другого потока в состоянии ожидания о том, что количество времени прошло и что оно может продолжаться...

Например, когда поток А должен ждать определенное количество времени, вы можете перевести поток в состояние ожидания и запустить задачу таймера, которая после определенного количества времени (интервала) вызова уведомляет и пробуждает поток А, который идет вперед, это может быть альтернативой.

Если вы хотите быть точным со звуками, вы используете секвенсор и устанавливаете темп в BPM: sequencer.setTempoInBPM(120);

Не забывайте о паузах сборщика мусора. Это может превзойти все ваши планы

Другие вопросы по тегам