code: // from gee.cs.oswego.edu/home/jsr166/jsr166
  
  package jsr166tests.loops;
  
  /*
   * Written by Doug Lea with assistance from members of JCP JSR-166
   * Expert Group and released to the public domain, as explained at
   * http://creativecommons.org/licenses/publicdomain
   */
  import java.util.concurrent.*;
  import java.util.Random;
  
  public class TimeUnitLoops {
  
      static final LoopHelpers.SimpleRandom rng = new LoopHelpers.SimpleRandom();
  
      /**
       * False value allows aggressive inlining of cvt() calls from
       * test(). True value prevents any inlining, requiring virtual
       * method dispatch.
       */
      static final boolean PREVENT_INLINING = true;
  
      // The following all are used by inlining prevention clause:
      static int index = 0;
      static final int NUNITS = 100;
      static final TimeUnit[] units = new TimeUnit[NUNITS];
      static {
          TimeUnit[] v = TimeUnit.values();
          for (int i = 0; i < NUNITS; ++i)
              units[i] = v[rng.next() % v.length];
      }
  
      public static void main(String[] args) throws Exception {
          long start = System.currentTimeMillis();
          long s = 0;
          for (int i = 0; i < 100; ++i) {
              s += test();
              if (s == start) System.out.println(" ");
          }
          long end = System.currentTimeMillis();
          System.out.println("Time: " + (end - start) + " ms");
      }
  
      static long test() {
          long sum = 0;
          int x = rng.next();
          for (int i = 0; i < 1000000; ++i) {
              long l = (long) x + (long) x;
              sum += cvt(l, TimeUnit.SECONDS);
              sum += TimeUnit.MILLISECONDS.toMicros(l+2);
              sum += cvt(l+17, TimeUnit.NANOSECONDS);
              sum += cvt(l+42, TimeUnit.MILLISECONDS);
              x = LoopHelpers.compute4(x);
          }
          return sum + x;
      }
  
      static long cvt(long d, TimeUnit u) {
          if (PREVENT_INLINING) {
              u = units[index];
              index = (index+1) % NUNITS;
          }
  
          return u.toNanos(d);
      }
  }
  