【问题标题】:TimerTask vs Thread.sleep vs Handler postDelayed - most accurate to call function every N milliseconds?TimerTask vs Thread.sleep vs Handler postDelayed - 每N毫秒调用一次函数最准确?
【发布时间】:2013-09-07 11:06:03
【问题描述】:

每 N 毫秒调用一次函数最准确的方法是什么?

  • 带有 Thread.sleep 的线程
  • 定时器任务
  • 带有 postDelayed 的处理程序

我使用 Thread.sleep 修改了this example,但不是很准确。

我正在开发一个音乐应用程序,它将以给定的 BPM 播放声音。我知道创建一个完全准确的节拍器是不可能的,我也不需要 - 只是想找到最好的方法来做到这一点。

谢谢

【问题讨论】:

标签: java android multithreading handler timertask


【解决方案1】:

使用 TimerTask 进行循环动作是更好的选择。推荐

【讨论】:

【解决方案2】:

它们在精度方面都是相同的。 Java 计时精度受系统计时器和调度程序的精度和准确性的影响,无法保证。请参阅 Thread.sleep 和 Object.wait API。

【讨论】:

    【解决方案3】:

    在 Android 上,您可以使用自己的处理程序/消息队列创建线程。这是相当准确的。当您看到 Handler documentation 时,您会看到,它就是为此而设计的。

    Handler 有两个主要用途:(1) 安排消息和可运行文件在未来某个时间点执行; 以及 (2) 将要在与您自己的线程不同。

    【讨论】:

      【解决方案4】:

      使用定时器有一些缺点

      • 它只创建一个线程来执行任务,如果一个任务 运行时间太长,其他任务会受到影响。
      • 它不处理 任务和线程抛出的异常只是终止,这会影响 其他计划任务,它们从不运行

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

      【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2011-08-26
      • 2018-10-12
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多