定时器使用大量内存

Pro*_*yb2 2 java

对于我的 MIDI 播放器,我想在 1 秒内打印 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Col*_*inD 6

我真的不明白这段代码如何导致任何类型的大量内存消耗,除非它与创建新线程的惊人速度有关。

无论如何,您应该使用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);
}
Run Code Online (Sandbox Code Playgroud)

在这里,该tick方法将启动您的计时器运行,Runnable每隔millisecondsms调用一次,立即启动。它还将 a 分配Future<?>给一个字段...这允许您timingTask.cancel(true)在设置sequencer为之前调用以取消计划任务的运行null