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

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

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

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

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

благодаря

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

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

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); 

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

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

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

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

  • java.lang.ClassNotFoundException: Не нашел class на пути: dexpathlist
  • Как разобрать stream ввода JSON
  • Состояние флажка ListView Viewholder
  • Проблемы с ресурсами.openRawResource ()
  • Преобразование строки в массив JSON
  • Как разобрать динамический ключ JSON в результате результата Nested JSON?
  • findviewbyid возвращает null в диалоговом окне
  • Как получить широту и долготу мобильного устройства в Android?
  • Статический порядок инициализации Java
  • Как объект будет вызывать метод toString неявно?
  • Почему в Java есть перегрузка и переопределение метода?
  • Interesting Posts

    Как отредактировать / создать новый пакетный скрипт для настройки массовой загрузки из серии ссылок?

    Встроенные функции в C #?

    Как удалить элемент из массива по значению?

    Компактная запись индексирования матрицы MATLAB

    Ярлык для «null, если объект имеет значение null, или object.member, если объект не является нулевым»

    В чем разница между POST и PUT HTTP REQUEST?

    Можно ли удалить встроенный ярлык из приложения в Mac OS X?

    Excel VBA: автозаполнение нескольких ячеек с формулами

    Услуги электронного факса (посылки)

    Как сделать диск Blu-ray / DVD / HD-DVD несколькими регионами?

    Как установить соединение по коммутируемому соединению автоматически после загрузки + загрузки 90 МБ данных в Windows?

    Изменение фонового изображения тела с эффектом затухания в jquery

    Если я использую материнскую плату SATAI, могу ли она использовать жесткие диски SATAII?

    Шаблон Spring JDBC для вызова хранимых процедур

    OpenCV Birdseye без потери данных

    Давайте будем гением компьютера.