* * The watch can be started, stopped and zeroed and can be queried for * elapsed running time. The watch accumulates elapsed time over starts * and stops such that only the time actually spent running is recorded. * If the watch is zeroed, then the accumulated time is discarded and * the watch starts again with zero acumulated time.
*
* @author boucherb@users
* @version 1.7.2
* @since 1.7.2
*/
public class StopWatch {
/**
* The last time this object made the transition
* from stopped to running state, as reported
* by System.currentTimeMillis().
*/
private long startTime;
private long lastStart;
/**
* The accumulated running time of this object since
* it was last zeroed.
*/
private long total;
/** Flags if this object is started or stopped. */
boolean running = false;
/** Creates, zeros, and starts a new StopWatch */
public StopWatch() {
this(true);
}
/** Creates, zeros, and starts a new StopWatch */
public StopWatch(boolean start) {
if (start) {
start();
}
}
/**
* Retrieves the accumulated time this object has spent running since
* it was last zeroed.
* @return the accumulated time this object has spent running since
* it was last zeroed.
*/
public long elapsedTime() {
if (running) {
return total + System.currentTimeMillis() - startTime;
} else {
return total;
}
}
/**
* Retrieves the accumulated time this object has spent running since
* it was last started.
* @return the accumulated time this object has spent running since
* it was last started.
*/
public long currentElapsedTime() {
if (running) {
return System.currentTimeMillis() - startTime;
} else {
return 0;
}
}
/** Zeros accumulated running time and restarts this object. */
public void zero() {
total = 0;
start();
}
/**
* Ensures that this object is in the running state. If this object is not
* running, then the call has the effect of setting the startTime
* attribute to the current value of System.currentTimeMillis() and setting
* the running
attribute to true
.
*/
public void start() {
startTime = System.currentTimeMillis();
running = true;
}
/**
* Ensures that this object is in the stopped state. If this object is
* in the running state, then this has the effect of adding to the
* total
attribute the elapsed time since the last transition
* from stopped to running state and sets the running
attribute
* to false. If this object is not in the running state, this call has no
* effect.
*/
public void stop() {
if (running) {
total += System.currentTimeMillis() - startTime;
running = false;
}
}
public void mark() {
stop();
start();
}
/**
* Retrieves prefix + " in " + elapsedTime() + " ms."
* @param prefix The string to use as a prefix
* @return prefix + " in " + elapsedTime() + " ms."
*/
public String elapsedTimeToMessage(String prefix) {
return prefix + " in " + elapsedTime() + " ms.";
}
/**
* Retrieves prefix + " in " + elapsedTime() + " ms."
* @param prefix The string to use as a prefix
* @return prefix + " in " + elapsedTime() + " ms."
*/
public String currentElapsedTimeToMessage(String prefix) {
return prefix + " in " + currentElapsedTime() + " ms.";
}
/**
* Retrieves the internal state of this object, as a String.
*
* The retreived value is:
*
*
* super.toString() + * "[running=" + * running + * ", startTime=" + * startTime + * ", total=" + * total + "]"; ** @return the state of this object, as a String */ public String toString() { return super.toString() + "[running=" + running + ", startTime=" + startTime + ", total=" + total + "]"; } }