PriorityCompete.java Source code

Java tutorial

Introduction

Here is the source code for PriorityCompete.java

Source

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