对于我的 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)
我真的不明白这段代码如何导致任何类型的大量内存消耗,除非它与创建新线程的惊人速度有关。
无论如何,您应该使用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。