计时器使用大量内存

时间:2010-11-15 05:46:16

标签: java

对于我的MIDI播放器,我想在一秒钟内打印10次以获得准确的时间,但是,程序会消耗相当多的内存,我该如何修复代码?

public void tick(int seconds) {
    timer = new Timer();
    timer.schedule(new tickcount(), seconds * 100);
}

class tickcount extends TimerTask {
    public void run() {
        if(sequencer != null) {
            System.out.println("sec"+sequencer.getMicrosecondPosition()/1000000);
            timer = null;
            tick(1);
        } else {
            timer.cancel();
        }
    }
}

2 个答案:

答案 0 :(得分:4)

我真的没有看到这段代码如何导致任何类型的大内存消耗,除非它与创建新线程的令人难以置信的速率有关。

无论如何,你应该使用ScheduledExecutorService ... Timer有点过时(尽管即使使用它,你也不应该每次创建一个新的Timer任务运行)。如果您希望tickcount任务中的代码每0.1秒运行一次,您可以这样做:

private final ScheduledExecutorService scheduler =
    Executors.newSingleThreadScheduledExecutor();

private Future<?> timingTask;

public void tick(long milliseconds) {
  timingTask = scheduler.scheduleAtFixedRate(new Runnable() {
    public void run() {
      System.out.println("sec"+sequencer.getMicrosecondPosition()/1000000);
    }
  }, 0, milliseconds, TimeUnit.MILLISECONDS);
}

此处,tick方法将启动您的计时器运行,每隔Runnable ms调用milliseconds,立即启动。它还会为字段分配Future<?> ...这样您就可以在将timingTask.cancel(true)设置为sequencer之前致电null取消已计划的任务。

答案 1 :(得分:3)

除了每次在tick()方法调用中创建Timer对象时,使用全局计时器对象实例并重用它