Java tutorial
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(); } }