当前位置: 首页 > 知识库问答 >
问题:

计时器任务 vs Thread.sleep vs 处理程序后放置 - 最准确地调用函数每 N 毫秒?

松昱
2023-03-14

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

    < li>Thread with Thread.sleep < li>TimerTask < li >具有后期延迟的处理程序

我用Thread.sleep修改了这个例子,它不是很准确。

我正在开发一个音乐应用程序,可以在给定的BPM下播放声音。我明白要创造一个完全准确的节拍器是不可能的,我不需要——只是想找到最好的方法。

谢谢

共有3个答案

徐瀚
2023-03-14

它们在精度方面都是相同的。Java 计时精度受制于系统计时器和调度程序的精度和准确性,不能保证。请参见线程睡眠和对象等待 API。

田宇
2023-03-14

在Android上,你可以用自己的处理程序/消息队列创建线程。挺准的。当你看到处理程序文档时,你会发现它就是为此而设计的。

处理程序有两个主要用途:(1)将消息和可运行的语句调度为将来的某个点执行;和 (2) 将要在与您自己的线程不同的线程上执行的操作排入队列。

胡鸿志
2023-03-14

使用计时器有一些缺点

  • 它只创建单个线程来执行任务,如果任务运行时间太长,其他任务也会受到影响。
  • 它不处理任务引发的异常,线程只是终止,这会影响其他计划任务,并且它们永远不会运行

在你的情况下,有两种方法可能是有用的… schduledThreadPoolExector正确地处理了所有这些问题,并且使用Timer是没有意义的……和schduleWithFixedDelay(………)

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);
 类似资料:
  • 问题内容: 每N毫秒调用一个函数的最准确方法是什么? 具有Thread.sleep的线程 计时器任务 具有postDelayed的处理程序 我使用Thread.sleep 修改了此示例,它不是很准确。 我正在开发一个音乐应用程序,它将以给定的BPM播放声音。我知道创建一个完全准确的节拍器是不可能的,而且我不需要-只是寻找找到最佳的节拍器方法。 谢谢 问题答案: 使用计时器有一些缺点 它仅创建一个线

  • 但是我不能在一个计时器中处理不同的“计时器任务”。我试图将计时器任务对象添加到构造函数中,但是当我将新的计时器任务(RemindTask1)对象作为参数(内部类的实例)传递时,出现编译错误。 以下是它如何处理一项任务: 但是我完全被多个任务应该如何创建然后运行所困扰。 但是这不起作用,我不知道出了什么问题。当我将新的RemindTask2()作为参数传递时,我遇到了编译错误。

  • 假设我想每10秒执行一次操作,它不一定需要更新视图。 问题是:在timertask中使用timer是否更好(我的意思是更高效、更有效): 或者只是一个有延迟的处理程序 此外,如果您能解释什么时候使用哪种方法,以及为什么其中一种方法比另一种更有效(如果确实有效),我将不胜感激。

  • 问题内容: 我正在开发节拍器应用程序。用户可以在运行时选择bpm,我的应用程序将相应地播放“滴答”声。“滴答”是一个节拍器“拍”(mp3)。我尝试使用Handler和MediaPlayer来实现它,但是节拍器一点也不精确。因此,我考虑了更改整个方法:当用户选择新的bpm值时,我通过每N毫秒重复X次滴答声,然后循环遍历此运行时创建的声音来合成新声音。这是有效的替代方法吗?如何在Android中实现?

  • 问题内容: 我正在Windows上的python中进行编程,想准确地测量函数运行所花费的时间。我已经编写了一个函数“ time_it”,该函数需要另一个函数,然后运行它并返回运行时间。 我称其为1000次并取平均值。(最后的1000常数以毫秒为单位给出答案。) 该函数似乎可以正常工作,但是我有一种na不安的感觉,那就是我做错了什么,通过这种方式,我花的时间比函数运行时实际花费的时间更多。 有没有更

  • 问题内容: 我正在尝试每1分钟显示一次味精!不停!我发现一个示例,它在固定延迟后仅显示一次味精!你能帮忙设置吗?或者如果使用计时器更好,我需要一个例子!! 谢谢! 问题答案: 试试这个代码-