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

时间:2011-02-27 11:32:05

标签: java timer 3d

HI。 我想在java中自动调用一个函数。

例如,我们使用Time类,如blew

每1秒actionperformerd()函数调用。

Timer time = new Time(10,this);
.
.
.
public void actionperformed()
{
        timer.run;
        //i want move a pic every 1millisecond.
}

我的问题是Timer类只接受int值而且它是最小的 值是1秒,我希望每1毫秒执行一次调用操作。

4 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:2)

尝试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);
}
BTW,计时器类不能定期准确地运行作业,它只能创建一个线程来运行任务。

答案 2 :(得分:1)

您可以使用单独的线程

class MyThread extends Thread {
  public void run() {
    while (!interrupted()) {
      try {
        // move my object, then sleep for a millisecond
        sleep(1);
      } catch (InterruptedException e) {
      }
    }
  }
}

然而,在实践中,您很少会设法让您每隔1 ms移动一次调用函数,因为其他线程也在消耗处理器时间。因此,您需要考虑上一个线程循环结束与当前时间之间的实际时间。

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

这是interesting article。适用于Android,但可以应用于标准Java。

答案 3 :(得分:0)

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

通过以1毫秒的间隔更新你的EDT更新(如果你每张照片都这样做更糟)你可能实际上使GUI无法使用 - 它正在忙于重绘而不是响应用户输入。

我真的不知道这种效果是否会以1 ms的间隔发生,但GUI的单线程设计是需要考虑的因素。