2010-11-15 5 views
0

Для моего 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(); 
     } 
    } 
} 
+1

Это может быть другая часть вашей программы, которая потребляет память. (и как побочная заметка, вы должны попытаться использовать соглашение при именовании классов, поэтому tickcount должен быть TickCount). –

+0

уверен, но вы имеете в виду, что распечатка будет использовать много памяти? Я просто добавил код таймера. – Proyb2

+2

Как вы определили, что эта часть кода потребляет память? –

ответ

3

Я не очень понимаю, как этот код может быть причиной какой-либо большой объем памяти потребление, если только оно не связано с невероятной скоростью, с которой он будет создавать новые потоки.

В любом случае, вы должны использовать 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 каждый milliseconds мса, немедленно начинают , Он также присваивает поле Future<?> ... это позволяет вам позвонить timingTask.cancel(true), чтобы отменить запланированное задание от запуска до установки sequencer до null.

+0

Ничего себе, попробуй. – Proyb2

+0

Что означает будущее ? – Proyb2

+0

[Будущее] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Future.html) - это интерфейс, представляющий (будущий) результат задачи, которая может или не может все еще бежали. Технически методы 'schedule' в' ScheduledExecutorService' возвращают 'ScheduledFuture', но здесь важна процедура' cancel' на 'Future', которая позволяет вам отменить текущую задачу, когда вам нужно. – ColinD

3

Помимо создания таймера объекта каждый раз, когда в клеща) вызова метода (используется глобальный экземпляр объекта таймера и повторно использовать его

+0

переместить таймер = новый таймер(); наверху? – Proyb2

Смежные вопросы