
com.googlecode.jpattern.shared.util.Chronometer Maven / Gradle / Ivy
package com.googlecode.jpattern.shared.util;
/**
* Classe di utilita' che realizza un cronometro per misurare
* intervalli temporali espressi in millisecondi. Basata sull'orologio
* di sistema (vedere System.currentTimeMillis()
).
*
* La precisione delle misure di tempo effettuate dipende dunque
* dall'accuratezza con la quale e' realizzato il timer di
* sistema Java: esperimenti pratici rivelano che in ambiente Windows
* la sensibilita' di System.currentTimeMillis()
e' di
* 10 ms, mentre su stazioni SUN Sparc, ad esempio, e' di 1 ms.
*
* Corretta anche in situazioni multi-threading.
*
*
* @author Marco Cimatti
* @version 1.0
*/
public class Chronometer {
/** Accumulatore contenente il numero dei millisecondi trascorsi. */
private long contatore;
/** Istante temporale dell'ultimo avvio del cronometro. */
private long avviato_a;
/** Variabile di stato che indica se il cronometro sta avanzando oppure no. */
private boolean avanzando;
/**
* Costruttore: resetta il cronometro invocando il metodo d'istanza
* azzera()
. Non avvia il conteggio; per fare cio' usare
* i metodi avanza()
ed avanzaDaCapo()
.
*
* @see #reset()
* @see #start()
* @see #restart()
*/
public Chronometer() { reset(); }
/** Metodo per (fermare ed) azzerare del cronometro. */
public void reset() {
synchronized (this) {
contatore = 0;
avanzando = false;
}
}
/**
* Metodo che fa (ri)partire il conteggio. Non azzera il
* cronometro, ma fa procedere la misura del tempo partendo dal
* valore immagazzinato nell'accumulatore.
*
* Il cronometro puo' essere fermato mediante ferma()
.
*
* @see #pause()
*/
public void start() {
synchronized (this) {
avviato_a = System.currentTimeMillis();
avanzando = true;
}
}
/**
* Metodo che blocca l'avanzamento del cronometro. Usare
* avanza()
per far ripartire il conteggio,
* avanzaDaCapo()
per azzerare il tutto prima di
* dare inizio al conteggio.
*
* @see #start()
* @see #restart()
*/
public void pause() {
synchronized (this) {
contatore += System.currentTimeMillis() - avviato_a;
avanzando = false;
}
}
/** Azzera il cronometro e ne fa partire il conteggio. */
public void restart() {
reset();
start();
}
/**
* Lettura del conteggio corrente effettuato dal cronometro.
* Chiamate successive a questo metodo riportano valori diversi
* nel caso in cui il cronometro stia avanzando.
*
* @return il numero totale di millisecondi contati dall'istanza.
*/
public long read() {
synchronized (this) {
return avanzando ? contatore + System.currentTimeMillis() - avviato_a : contatore;
}
}
/**
* Conversione in stringa del conteggio corrente. La lettura del
* valore viene effettuata mediante il metodo leggi()
.
*
* @return una stringa rappresentante il numero di millisecondi
* contati dall'istanza in questione.
* @see #read()
*/
public String toString() {
return "" + read();
}
}