Какие есть альтернативы Thread.sleep / Timer в Java?

Доброго времени суток.

Не так давно начал изучать Java. Сейчас пишу синтезатор под Андроид, захотелось реализовать в нем арпеджиатор. Арпеджиатор работает в отдельном потоке следующим образом:

1. Сканируем массив нот.
2. Если нота не равна нулю — включаем ее.
3. Засыпаем на ее длительность.
4. Выключаем ноту.
5. Засыпаем на интервал между нотами.
6. Переходим к следующей ноте.

В целом все работает, однако при использовании Sleep(), Timer() или nanoTime() длительность нот/интервалов непостоянна и изменяется в пределах +/- 20 мс, что, конечно, заметно на слух.
while(hasTouch)
{
    for (int note : sequence)
    {
        if (note != 0)
        {
            playNote(note);
            Thread.sleep(duration);
            stopNote(note);
            Thread.sleep(duration);
        }
    }
}

Каким образом можно добиться постоянных и точных интервалов? Какие еще есть способы приостановить выполнение кода на заданное время?
  • Вопрос задан
  • 4488 просмотров
Пригласить эксперта
Ответы на вопрос 3
@bimeg
while (target > System.nanoTime()){}
Ответ написан
anyd3v
@anyd3v
А через scheduler пробовали? И нужно ли вам вообще делать sleep?

developer.android.com/reference/java/util/concurre...
Ответ написан
Комментировать
@rewlad
Я не спец по Андроиду, но первое, что я бы пробил:
А какие вообще эта ОС (многозадачная, не реального времени) может дать гарантии по времени.
Если процессоров меньше, чем процессов ...

archlinux.org.ru/forum/topic/12042/?page=2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы