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 для действия цикла является лучшим. Рекомендую