Ultimamente ho creato un programma molto semplice. Un contatore del tempo che ha la capacità di mettere in pausa. Funzionava con 3 thread, 2 per Swing e 1 per il thread principale.while (true) loop o java.util.Timer per un ciclo di programma standard?
Per questo programma ci dovrebbe essere una parte di conteggio delta del tempo nella parte principale. Ho creato un sistema molto semplice come quello;
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));
}
}
Questo codice ha causato un elevato utilizzo della CPU. Ho quindi sostituito questo blocco di codice con:
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);
E il problema era sparito. Mi chiedo solo la ragione. Inoltre, qual è il modo migliore per creare un ciclo del programma?
Il ciclo 'while (true)' non fa alcuna pausa, quindi il ciclo è costantemente in esecuzione e mangia costantemente CPU. La pianificazione rende eseguibile il metodo 'run', solo quando è pianificato. – Berger
Quindi, se avessi fatto in modo che lo schedulatore chiamasse una volta per 50 nanosecondi, sarebbe lo stesso?E ancora qual è il modo migliore per creare un loop di programma? @Berger – iGoodie
Dipende dalla durata del metodo 'run', ma 50 nanosecondi sono veramente bassi, hai bisogno di una frequenza così alta? Comunque, come hai visto, è meglio lasciare respirare l'applicazione, quindi usa uno schedulatore o aggiungi un 'Thread.sleep' al tuo ciclo' while'. – Berger