TimerTask vs Thread.sleep vs Handler postDelayed - 每N毫秒调用一次函数最准确?

Posted

技术标签:

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

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

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

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

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

谢谢

【问题讨论】:

我更喜欢 Timer 来实现这一点 @BirajZalavadia 不要使用 Timer (mopri.de/2010/timertask-bad-do-it-the-android-way-use-a-handler),使用 Handler 或 ScheduledThreadPoolExecutor。 【参考方案1】:

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

【讨论】:

我严重怀疑它,检查这个androidtrainningcenter.blogspot.in/2013/12/…【参考方案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);

【讨论】:

哇!非常感谢 - 这几乎是完美的!比我的旧方法更好的时机 我正在尝试这种方法来执行周期性任务,但它似乎不起作用***.com/questions/27872016/…

以上是关于TimerTask vs Thread.sleep vs Handler postDelayed - 每N毫秒调用一次函数最准确?的主要内容,如果未能解决你的问题,请参考以下文章

Thread.Sleep(2500) 与 Task.Delay(2500).Wait()

为啥要放弃使用Thread.Sleep

Java:关于Thread.sleep()

如果 Task.Delay 优于 Thread.Sleep,为啥本书中的示例使用 Thread.Sleep?

多线程编程里的thread.sleep问题

timeunit的sleep和thread的sleep有啥区别