如何在Java中每毫秒调用一次方法

如何在Java中每毫秒调用一次方法,java,timer,3d,Java,Timer,3d,嗨。 我想要一个java中自动调用的函数 例如,我们使用Time类 actionperformerd()函数每1秒调用一次 Timer time = new Time(10,this); . . . public void actionperformed() { timer.run; //i want move a pic every 1millisecond. } 我的问题是Timer类只接受int值,并且它是最小值 值为1秒,我希望每1毫秒执行一次调用操作。

嗨。 我想要一个java中自动调用的函数

例如,我们使用
Time

actionperformerd()
函数每1秒调用一次

Timer time = new Time(10,this);
.
.
.
public void actionperformed()
{
        timer.run;
        //i want move a pic every 1millisecond.
}
我的问题是
Timer
类只接受int值,并且它是最小值 值为1秒,我希望每1毫秒执行一次调用操作。

Java在参数中接受毫秒。所以你可以

new Timer().schedule(new TimerTask() {
public void run()  {
  // do stuff
}
}, 1, 1);

但要获得毫秒精度的实时功能,您可能需要切换到C。

您可以使用单独的线程

class MyThread extends Thread {
  public void run() {
    while (!interrupted()) {
      try {
        // move my object, then sleep for a millisecond
        sleep(1);
      } catch (InterruptedException e) {
      }
    }
  }
}
然而,在实践中,您很少能够每1ms调用一次move函数,因为其他线程也在消耗处理器时间。因此,您需要考虑上一个线程循环结束与当前时间之间的实际时间

我建议您阅读大量关于“游戏循环”的教程,您将学习如何组织移动对象、渲染等功能


这是一个很好的例子。适用于Android,但可以应用于标准Java。

如果这是图形化的,请注意您实际上在EDT(事件调度线程)中更新了屏幕。GUI不是多线程的

通过在1毫秒的时间间隔内对EDT进行更新(如果按照图片进行更新,情况会更糟),实际上可能会使GUI无法使用-它忙于重新绘制,而不是响应用户输入


我真的不知道这种影响是否每隔1毫秒发生一次,但GUI的单线程设计需要考虑。

尝试java.util.concurrent中的一些类,ScheduledThreadPoolExecutor可以完成您想要做的事情:

public static void main(String[] args) throws Exception {
    ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10);
    executor.schedule(new Runnable() {
        @Override
        public void run() {
            // Do something here.
        }
    }, 1, TimeUnit.MILLISECONDS);
}

顺便说一句,timer类不能定期准确地运行作业,它只能创建一个线程来运行任务。

“我想要一个函数。”不是一个有用的问题标题。“提问”页面上的“标题”框(在您开始键入之前)说:“您的编程问题是什么?请具体点”(我的重点)。因此,您希望以1000fps的速度更新对象?无论如何都没有保证。Java无法保证当时有足够的容量运行作业。虽然很多事情都可以在1毫秒内完成,但它仍然是有限的,除非你每次只启动一个新线程并拥有多个核心机器。正如Dan D讽刺地指出的,每1毫秒更新一次不太可能有用(也不太可能成功)。电脑屏幕刷新速度没有那么快:最多可以刷新150fps左右(请不要发表未受过教育的评论“人类不能识别超过24fps”),所以每5毫秒就可以了。但是你必须确保你的操作足够快。你可能会从游戏程序员那里得到比普通程序员更好的建议,因为游戏编程本身就是一门艺术(过去就是这样)。根据刷新率,屏幕每秒最多只能更新100次。如果示例没有使用anon.类,操作可能会更容易?谢谢,这适用于在ACM库中移动Gobject。