对于我的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();
}
}
}
答案 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对象时,使用全局计时器对象实例并重用它