001         package com.croftsoft.core.util;
002    
003         import com.croftsoft.core.lang.lifecycle.Resumable;
004    
005         /*********************************************************************
006         * Used for timing events with millisecond precision.
007         *
008         * @version
009         *   2001-07-03
010         * @since
011         *   2001-07-03
012         * @author
013         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
014         *********************************************************************/
015    
016         public final class  Stopwatch
017           implements Resumable
018         //////////////////////////////////////////////////////////////////////
019         //////////////////////////////////////////////////////////////////////
020         {
021    
022         private long     elapsedTime;
023    
024         private boolean  isTicking;
025    
026         private long     startTime;
027    
028         //////////////////////////////////////////////////////////////////////
029         //////////////////////////////////////////////////////////////////////
030    
031         /*********************************************************************
032         * Returns the elapsed time in milliseconds.
033         *********************************************************************/
034         public synchronized long  getElapsedTime ( )
035         //////////////////////////////////////////////////////////////////////
036         {
037           if ( isTicking )
038           {
039             return System.currentTimeMillis ( ) - startTime;
040           }
041           else
042           {
043             return elapsedTime;
044           }
045         }
046    
047         //////////////////////////////////////////////////////////////////////
048         //////////////////////////////////////////////////////////////////////
049    
050         public synchronized void  reset ( )
051         //////////////////////////////////////////////////////////////////////
052         {
053           elapsedTime = 0;
054    
055           isTicking = false;
056         }
057    
058         public synchronized void  start ( )
059         //////////////////////////////////////////////////////////////////////
060         {
061           if ( isTicking )
062           {
063             throw new IllegalStateException ( "already started" );
064           }
065    
066           isTicking = true;
067    
068           startTime = System.currentTimeMillis ( );
069         }
070    
071         public synchronized void  stop ( )
072         //////////////////////////////////////////////////////////////////////
073         {
074           if ( !isTicking )
075           {
076             throw new IllegalStateException ( "not started" );
077           }
078    
079           elapsedTime = System.currentTimeMillis ( ) - startTime; 
080    
081           isTicking = false;
082         }
083    
084         //////////////////////////////////////////////////////////////////////
085         //////////////////////////////////////////////////////////////////////
086         }