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.*;
  import java.util.concurrent.*;
  import java.util.concurrent.locks.*;
  import java.util.concurrent.atomic.*;
  
  public class UnboundedQueueFillEmptyLoops {
      static int maxSize = 10000;
      static Random rng = new Random(3153122688L);
      static volatile int total;
      static Integer[] numbers;
  
      public static void main(String[] args) throws Exception {
          Class klass = null;
          if (args.length > 0) {
              try {
                  klass = Class.forName(args[0]);
              } catch (ClassNotFoundException e) {
                  throw new RuntimeException("Class " + args[0] + " not found.");
              }
          }
  
          if (args.length > 2)
              maxSize = Integer.parseInt(args[2]);
  
          System.out.print("Class: " + klass.getName());
          System.out.println(" size: " + maxSize);
  
          numbers = new Integer[maxSize];
          for (int i = 0; i < maxSize; ++i)
              numbers[i] = rng.nextInt(128);
  
          oneRun(klass, maxSize);
          Thread.sleep(100);
          oneRun(klass, maxSize);
          Thread.sleep(100);
          oneRun(klass, maxSize);
  
          if (total == 0) System.out.print(" ");
     }
  
      static void oneRun(Class klass, int n) throws Exception {
          Queue<Integer> q = (Queue<Integer>) klass.newInstance();
          int sum = total;
          int m = rng.nextInt(numbers.length);
          long startTime = System.nanoTime();
          for (int k = 0; k < n; ++k) {
              for (int i = 0; i < k; ++i) {
                  if (m >= numbers.length)
                      m = 0;
                  q.offer(numbers[m++]);
              }
              Integer p;
              while ((p = q.poll()) != null)
                  sum += p.intValue();
          }
          total += sum;
          long endTime = System.nanoTime();
          long time = endTime - startTime;
          double secs = (double) time / 1000000000.0;
          System.out.println("Time: " + secs);
      }
  
  }
  