Threads Java

public class PriorityCompete extends Object {
  private volatile int count;
  private boolean yield;
  private Thread internalThread;
  private volatile boolean noStopRequested;
  public PriorityCompete(String name, int priority, boolean yield) {
    count = 0;
    this.yield = yield;
    noStopRequested = true;
    Runnable r = new Runnable() {
      public void run() {
        try {
          runWork();
        } catch (Exception x) {
          x.printStackTrace();
        }
      }
    };
    internalThread = new Thread(r, name);
    internalThread.setPriority(priority);
  }
  private void runWork() {
    Thread.yield();
    while (noStopRequested) {
      if (yield) {
        Thread.yield();
      }
      count++;
      for (int i = 0; i < 1000; i++) {
        double x = i * Math.PI / Math.E;
      }
    }
  }
  public void startRequest() {
    internalThread.start();
  }
  public void stopRequest() {
    noStopRequested = false;
  }
  public int getCount() {
    return count;
  }
  public String getNameAndPriority() {
    return internalThread.getName() + ": priority="
        + internalThread.getPriority();
  }
  private static void runSet(boolean yield) {
    PriorityCompete[] pc = new PriorityCompete[3];
    pc[0] = new PriorityCompete("P0", 3, yield);
    pc[1] = new PriorityCompete("P1", 6, yield);
    pc[2] = new PriorityCompete("P2", 6, yield);
    try {
      Thread.sleep(1000);
    } catch (InterruptedException x) {
    }
    for (int i = 0; i < pc.length; i++) {
      pc[i].startRequest();
    }
    long startTime = System.currentTimeMillis();
    try {
      Thread.sleep(10000);
    } catch (InterruptedException x) {
    }
    for (int i = 0; i < pc.length; i++) {
      pc[i].stopRequest();
    }
    long stopTime = System.currentTimeMillis();
    try {
      Thread.sleep(1000);
    } catch (InterruptedException x) {
    }
    int totalCount = 0;
    for (int i = 0; i < pc.length; i++) {
      totalCount += pc[i].getCount();
    }
    System.out.println("totalCount=" + totalCount + ", count/ms="
        + roundTo(((double) totalCount) / (stopTime - startTime), 3));
    for (int i = 0; i < pc.length; i++) {
      double perc = roundTo(100.0 * pc[i].getCount() / totalCount, 2);
      System.out.println(pc[i].getNameAndPriority() + ", " + perc
          + "%, count=" + pc[i].getCount());
    }
  }
  public static double roundTo(double val, int places) {
    double factor = Math.pow(10, places);
    return ((int) ((val * factor) + 0.5)) / factor;
  }
  public static void main(String[] args) {
    Runnable r = new Runnable() {
      public void run() {
        System.out.println("Run without using yield()");
        System.out.println("=========================");
        runSet(false);
        System.out.println();
        System.out.println("Run using yield()");
        System.out.println("=================");
        runSet(true);
      }
    };
    Thread t = new Thread(r, "Priority");
    t.setPriority(Thread.MAX_PRIORITY - 1);
    t.start();
  }
}