TimerTask vs Thread.sleep vs Handler postDelayed - наиболее точная функция вызова каждые N миллисекундов?

Каков наиболее точный способ вызова функции каждые N миллисекунд?

  • Тема с Thread.sleep
  • TimerTask
  • Обработчик с postDelayed

Я изменил этот пример, используя Thread.sleep, и это не очень точно.

Я разрабатываю музыкальное приложение, которое будет воспроизводить звуки при заданном BPM. Я понимаю, что невозможно создать полностью точный метроном, и мне не нужно - просто искать лучший способ сделать это.

Спасибо

Ответ 1

Есть некоторые недостатки использования таймера

  • Он создает только один поток для выполнения задач, и если задача занимает слишком много времени, чтобы выполнять другие задачи.
  • Он не обрабатывает исключения, брошенные задачами и потоком, просто заканчиваются, что влияет на другие запланированные задачи, и они никогда не запускаются.

ScheduledThreadPoolExecutor правильно справляется со всеми этими проблемами, и нет смысла использовать таймер. В вашем случае могут быть использованы два метода. scheduleAtFixedRate (...) и scheduleWithFixedDelay (..)

class MyTask implements Runnable {

  @Override
  public void run() {
    System.out.println("Hello world");
  } 
}

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
long period = 100; // the period between successive executions
exec.scheduleAtFixedRate(new MyTask(), 0, period, TimeUnit.MICROSECONDS);
long delay = 100; //the delay between the termination of one execution and the commencement of the next
exec.scheduleWithFixedDelay(new MyTask(), 0, delay, TimeUnit.MICROSECONDS);

Ответ 2

В Android вы можете создать Thread с его собственной обработкой/очередью сообщений. Это довольно точно. Когда вы видите Handler документацию, вы можете видеть, что он был разработан для этого.

Для обработчика используются два основных применения: (1) для планирования сообщений и исполняемых файлов, которые будут выполняться как некоторые из них в будущем; и (2), чтобы установить действие, выполняемое на другой поток, чем ваш собственный.

Ответ 3

Они все одинаковы по точности. Точность и точность таймингов и планировщиков времени Java не гарантируется. См. API Thread.sleep и Object.wait.

Ответ 4

Использование TimerTask для действия цикла является лучшим. Рекомендую