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

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

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

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

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

благодаря

Solutions Collecting From Web of "TimerTask vs Thread.sleep vs Handler postDelayed – наиболее точная функция вызова каждые N миллисекунд?"

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

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

ScheduledThreadPoolExecutor правильно справляется со всеми этими проблемами, и нет смысла использовать Timer .. В вашем случае могут быть использованы два метода. 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); 

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

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

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

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