每N毫秒调用一个函数的最准确方法是什么?
我使用Thread.sleep修改了this example并且它不是很准确。
我正在开发一个音乐应用程序,它将在给定的BPM上播放声音。我知道创建一个完全准确的节拍器是不可能的,我不需要 - 只是想找到最好的方法来做到这一点。
由于
答案 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进行循环操作是更好的方法。推介