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

时间:2013-09-04 04:26:58

标签: java android multithreading handler timertask

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

  • Thread.sleep线程
  • 的TimerTask
  • 使用postDelayed的处理程序

我使用Thread.sleep修改了this example并且它不是很准确。

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

由于

4 个答案:

答案 0 :(得分:58)

使用Timer

有一些缺点
  • 它只创建一个线程来执行任务和任务 运行时间太长,其他任务受损。
  • 它无法处理 任务和线程抛出的异常只会终止,这会影响 其他计划任务,它们永远不会运行

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

答案 1 :(得分:7)

在Android上,您可以使用自己的Handler / Message Queue创建Thread。这很准确。当您看到Handler documentation时,您可以看到它是为此而设计的。

  

Handler有两个主要用途:(1)安排消息和runnables作为将来的某个点执行; 和(2)将要执行的操作排入队列与你自己不同的线索。

答案 2 :(得分:1)

它们在精确度上都是一样的。 Java计时精度取决于系统计时器和调度程序的精度和准确性,并不能保证。请参阅Thread.sleep和Object.wait API。

答案 3 :(得分:-11)

使用TimerTask进行循环操作是更好的方法。推介