Class StopWatch


  • public class StopWatch
    extends java.lang.Object

    StopWatch provides a convenient API for timings.

    To start the watch, call start() or createStarted(). At this point you can:

    • split() the watch to get the time whilst the watch continues in the background. unsplit() will remove the effect of the split. At this point, these three options are available again.
    • suspend() the watch to pause it. resume() allows the watch to continue. Any time between the suspend and resume will not be counted in the total. At this point, these three options are available again.
    • stop() the watch to complete the timing session.

    It is intended that the output methods toString() and getTime() should only be called after stop, split or suspend, however a suitable result will be returned at other points.

    NOTE: As from v2.1, the methods protect against inappropriate calls. Thus you cannot now call stop before start, resume before suspend or unsplit before split.

    1. split(), suspend(), or stop() cannot be invoked twice
    2. unsplit() may only be called if the watch has been split()
    3. resume() may only be called if the watch has been suspend()
    4. start() cannot be called twice without calling reset()

    This class is not thread-safe

    Since:
    2.0
    • Nested Class Summary

      Nested Classes 
      Modifier and Type Class Description
      private static class  StopWatch.SplitState
      Enumeration type which indicates the split status of stopwatch.
      private static class  StopWatch.State
      Enumeration type which indicates the status of stopwatch.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.lang.String message
      A message for string presentation.
      private static long NANO_2_MILLIS  
      private StopWatch.State runningState
      The current running state of the StopWatch.
      private StopWatch.SplitState splitState
      Whether the stopwatch has a split time recorded.
      private long startTimeMillis
      The start time in milliseconds - nanoTime is only for elapsed time so we need to also store the currentTimeMillis to maintain the old getStartTime API.
      private long startTimeNanos
      The start time in nanoseconds.
      private long stopTimeMillis
      The end time in milliseconds - nanoTime is only for elapsed time so we need to also store the currentTimeMillis to maintain the old getStartTime API.
      private long stopTimeNanos
      The stop time in nanoseconds.
    • Constructor Summary

      Constructors 
      Constructor Description
      StopWatch()
      Constructor.
      StopWatch​(java.lang.String message)
      Constructor.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      static StopWatch create()
      Creates a stopwatch for convenience.
      static StopWatch createStarted()
      Creates a started stopwatch for convenience.
      java.lang.String formatSplitTime()
      Returns the time formatted by DurationFormatUtils.formatDurationHMS(long).
      java.lang.String formatTime()
      Returns the split time formatted by DurationFormatUtils.formatDurationHMS(long).
      java.lang.String getMessage()
      Gets the message for string presentation.
      long getNanoTime()
      Gets the elapsed time in nanoseconds.
      long getSplitNanoTime()
      Gets the split time in nanoseconds.
      long getSplitTime()
      Gets the split time on the stopwatch.
      long getStartTime()
      Gets the time this stopwatch was started in milliseconds, between the current time and midnight, January 1, 1970 UTC.
      long getStopTime()
      Gets the time this stopwatch was stopped in milliseconds, between the current time and midnight, January 1, 1970 UTC.
      long getTime()
      Gets the time on the stopwatch.
      long getTime​(java.util.concurrent.TimeUnit timeUnit)
      Gets the time in the specified TimeUnit.
      boolean isStarted()
      Returns whether the StopWatch is started.
      boolean isStopped()
      Returns whether StopWatch is stopped.
      boolean isSuspended()
      Returns whether the StopWatch is suspended.
      void reset()
      Resets the stopwatch.
      void resume()
      Resumes the stopwatch after a suspend.
      void split()
      Splits the time.
      void start()
      Starts the stopwatch.
      void stop()
      Stops the stopwatch.
      void suspend()
      Suspends the stopwatch for later resumption.
      java.lang.String toSplitString()
      Gets a summary of the split time that the stopwatch recorded as a string.
      java.lang.String toString()
      Gets a summary of the time that the stopwatch recorded as a string.
      void unsplit()
      Removes a split.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    • Field Detail

      • message

        private final java.lang.String message
        A message for string presentation.
        Since:
        3.10
      • runningState

        private StopWatch.State runningState
        The current running state of the StopWatch.
      • splitState

        private StopWatch.SplitState splitState
        Whether the stopwatch has a split time recorded.
      • startTimeNanos

        private long startTimeNanos
        The start time in nanoseconds.
      • startTimeMillis

        private long startTimeMillis
        The start time in milliseconds - nanoTime is only for elapsed time so we need to also store the currentTimeMillis to maintain the old getStartTime API.
      • stopTimeMillis

        private long stopTimeMillis
        The end time in milliseconds - nanoTime is only for elapsed time so we need to also store the currentTimeMillis to maintain the old getStartTime API.
      • stopTimeNanos

        private long stopTimeNanos
        The stop time in nanoseconds.
    • Constructor Detail

      • StopWatch

        public StopWatch()

        Constructor.

      • StopWatch

        public StopWatch​(java.lang.String message)

        Constructor.

        Parameters:
        message - A message for string presentation.
        Since:
        3.10
    • Method Detail

      • create

        public static StopWatch create()
        Creates a stopwatch for convenience.
        Returns:
        StopWatch a stopwatch.
        Since:
        3.10
      • createStarted

        public static StopWatch createStarted()
        Creates a started stopwatch for convenience.
        Returns:
        StopWatch a stopwatch that's already been started.
        Since:
        3.5
      • getMessage

        public java.lang.String getMessage()
        Gets the message for string presentation.
        Returns:
        the message for string presentation.
        Since:
        3.10
      • getNanoTime

        public long getNanoTime()

        Gets the elapsed time in nanoseconds.

        This is either the time between the start and the moment this method is called, or the amount of time between start and stop.

        Returns:
        the elapsed time in nanoseconds.
        Since:
        3.0
        See Also:
        System.nanoTime()
      • getSplitNanoTime

        public long getSplitNanoTime()

        Gets the split time in nanoseconds.

        This is the time between start and latest split.

        Returns:
        the split time in nanoseconds
        Throws:
        java.lang.IllegalStateException - if the StopWatch has not yet been split.
        Since:
        3.0
      • getSplitTime

        public long getSplitTime()

        Gets the split time on the stopwatch.

        This is the time between start and latest split.

        Returns:
        the split time in milliseconds
        Throws:
        java.lang.IllegalStateException - if the StopWatch has not yet been split.
        Since:
        2.1
      • getStartTime

        public long getStartTime()
        Gets the time this stopwatch was started in milliseconds, between the current time and midnight, January 1, 1970 UTC.
        Returns:
        the time this stopwatch was started in milliseconds, between the current time and midnight, January 1, 1970 UTC.
        Throws:
        java.lang.IllegalStateException - if this StopWatch has not been started
        Since:
        2.4
      • getStopTime

        public long getStopTime()
        Gets the time this stopwatch was stopped in milliseconds, between the current time and midnight, January 1, 1970 UTC.
        Returns:
        the time this stopwatch was started in milliseconds, between the current time and midnight, January 1, 1970 UTC.
        Throws:
        java.lang.IllegalStateException - if this StopWatch has not been started
        Since:
        3.12.0
      • getTime

        public long getTime()

        Gets the time on the stopwatch.

        This is either the time between the start and the moment this method is called, or the amount of time between start and stop.

        Returns:
        the time in milliseconds
      • getTime

        public long getTime​(java.util.concurrent.TimeUnit timeUnit)

        Gets the time in the specified TimeUnit.

        This is either the time between the start and the moment this method is called, or the amount of time between start and stop. The resulting time will be expressed in the desired TimeUnit with any remainder rounded down. For example, if the specified unit is TimeUnit.HOURS and the stopwatch time is 59 minutes, then the result returned will be 0.

        Parameters:
        timeUnit - the unit of time, not null
        Returns:
        the time in the specified TimeUnit, rounded down
        Since:
        3.5
      • isStarted

        public boolean isStarted()

        Returns whether the StopWatch is started. A suspended StopWatch is also started watch.

        Returns:
        boolean If the StopWatch is started.
        Since:
        3.2
      • isStopped

        public boolean isStopped()

        Returns whether StopWatch is stopped. The stopwatch which's not yet started and explicitly stopped stopwatch is considered as stopped.

        Returns:
        boolean If the StopWatch is stopped.
        Since:
        3.2
      • isSuspended

        public boolean isSuspended()

        Returns whether the StopWatch is suspended.

        Returns:
        boolean If the StopWatch is suspended.
        Since:
        3.2
      • reset

        public void reset()

        Resets the stopwatch. Stops it if need be.

        This method clears the internal values to allow the object to be reused.

      • resume

        public void resume()

        Resumes the stopwatch after a suspend.

        This method resumes the watch after it was suspended. The watch will not include time between the suspend and resume calls in the total time.

        Throws:
        java.lang.IllegalStateException - if the StopWatch has not been suspended.
      • split

        public void split()

        Splits the time.

        This method sets the stop time of the watch to allow a time to be extracted. The start time is unaffected, enabling unsplit() to continue the timing from the original start point.

        Throws:
        java.lang.IllegalStateException - if the StopWatch is not running.
      • start

        public void start()

        Starts the stopwatch.

        This method starts a new timing session, clearing any previous values.

        Throws:
        java.lang.IllegalStateException - if the StopWatch is already running.
      • stop

        public void stop()

        Stops the stopwatch.

        This method ends a new timing session, allowing the time to be retrieved.

        Throws:
        java.lang.IllegalStateException - if the StopWatch is not running.
      • suspend

        public void suspend()

        Suspends the stopwatch for later resumption.

        This method suspends the watch until it is resumed. The watch will not include time between the suspend and resume calls in the total time.

        Throws:
        java.lang.IllegalStateException - if the StopWatch is not currently running.
      • toSplitString

        public java.lang.String toSplitString()

        Gets a summary of the split time that the stopwatch recorded as a string.

        The format used is ISO 8601-like, [message ]hours:minutes:seconds.milliseconds.

        Returns:
        the split time as a String
        Since:
        2.1, 3.10 Returns the prefix "message " if the message is set.
      • toString

        public java.lang.String toString()

        Gets a summary of the time that the stopwatch recorded as a string.

        The format used is ISO 8601-like, [message ]hours:minutes:seconds.milliseconds.

        Overrides:
        toString in class java.lang.Object
        Returns:
        the time as a String
        Since:
        3.10 Returns the prefix "message " if the message is set.
      • unsplit

        public void unsplit()

        Removes a split.

        This method clears the stop time. The start time is unaffected, enabling timing from the original start point to continue.

        Throws:
        java.lang.IllegalStateException - if the StopWatch has not been split.