001         package com.croftsoft.core.util.loop;
002    
003         import com.croftsoft.core.math.MathConstants;
004    
005         /*********************************************************************
006         * Maintains a periodic rate by stalling the loop by a fixed delay.
007         *
008         * @author
009         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
010         * @version
011         *   2003-05-22
012         * @since
013         *   2002-03-07
014         *********************************************************************/
015    
016         public final class  FixedDelayLoopGovernor
017           implements LoopGovernor
018         //////////////////////////////////////////////////////////////////////
019         //////////////////////////////////////////////////////////////////////
020         {
021    
022         private final long  delayMillis;
023    
024         private final int   delayNanos;
025    
026         //////////////////////////////////////////////////////////////////////
027         // constructor methods
028         //////////////////////////////////////////////////////////////////////
029    
030         public  FixedDelayLoopGovernor (
031           long  delayMillis,
032           int   delayNanos )
033         //////////////////////////////////////////////////////////////////////
034         {
035           this.delayMillis = delayMillis;
036    
037           this.delayNanos  = delayNanos;
038         }
039    
040         /*********************************************************************
041         * Constructs a LoopGovernor with the specified target frequency.
042         *
043         * @param  frequency
044         *
045         *   The targeted loop frequency in loops per second.
046         *********************************************************************/
047         public  FixedDelayLoopGovernor ( double  frequency )
048         //////////////////////////////////////////////////////////////////////
049         {
050           if ( frequency <= 0.0 )
051           {
052             throw new IllegalArgumentException ( "frequency <= 0.0" );
053           }
054    
055           long  periodNanos
056             = ( long ) ( MathConstants.NANOSECONDS_PER_SECOND / frequency );
057    
058           delayMillis
059             = periodNanos / MathConstants.NANOSECONDS_PER_MILLISECOND;
060    
061           delayNanos = ( int )
062             ( periodNanos % MathConstants.NANOSECONDS_PER_MILLISECOND );
063         }
064    
065         //////////////////////////////////////////////////////////////////////
066         //////////////////////////////////////////////////////////////////////
067    
068         /*********************************************************************
069         * Stalls the current Thread by the fixed delay period.
070         *********************************************************************/
071         public void  govern ( )
072           throws InterruptedException
073         //////////////////////////////////////////////////////////////////////
074         {
075           Thread.sleep ( delayMillis, delayNanos );
076         }
077    
078         //////////////////////////////////////////////////////////////////////
079         //////////////////////////////////////////////////////////////////////
080         }