В последнее время я сделал очень простую программу. Счетчик времени, который имеет возможность приостановки. Он работал с 3 нитями, 2 для Swing и 1 для основной нити.while (true) loop или java.util.Timer для стандартного цикла программы?
Для этой программы в основной нити должна быть часть времени дельта-времени. Я создал такую базовую систему;
while(true)
{
long now = System.currentTimeMillis();
if(!sessionPaused)
{
if(now-programLastMs>1000)
{
save();
programLastMs = now;
}
sessionMs += now-sessionPrevMs;
overallMs += now-sessionPrevMs;
sessionPrevMs = now;
sessionLabel.setText(formatMillis("This Session:<br/>",sessionMs));
overallLabel.setText(formatMillis("Overall:<br/>", overallMs));
}
}
Этот код, приведенный выше, вызвал высокий уровень использования ЦП. Затем я заменил этот кусок кода на:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
long now = System.currentTimeMillis();
if(!sessionPaused)
{
if(now-programLastMs>1000)
{
save();
programLastMs = now;
}
sessionMs += now-sessionPrevMs;
overallMs += now-sessionPrevMs;
sessionPrevMs = now;
sessionLabel.setText(formatMillis("This Session:<br/>",sessionMs));
overallLabel.setText(formatMillis("Overall:<br/>", overallMs));
}
}
}, 0, 1);
И проблема исчезла. Мне просто интересно, почему. Также каков оптимальный способ создания цикла программы?
Ваш цикл while (true) 'не делает паузы, поэтому цикл постоянно работает и постоянно питается CPU. Планирование делает ваш метод 'run' выполненным, только когда он запланирован. – Berger
Итак, если бы я сделал планировщик, назовите его один раз за 50 наносекундов, будет ли он таким же?И все же каков оптимальный способ создания цикла программы? @Berger – iGoodie
Это зависит от продолжительности вашего метода 'run', но 50 наносекунд действительно низкое, вам нужна такая высокая частота? Однако, как вы это видели, лучше позволить вашему приложению дышать, поэтому либо используйте планировщик, либо добавьте 'Thread.sleep' в свой цикл while. – Berger