Main.java Source code

Java tutorial

Introduction

Here is the source code for Main.java

Source

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

public class Main {
    final int CPU_COUNT = 4;
    BlockingQueue<Runnable> lightTaskQueue = new LinkedBlockingDeque<Runnable>();

    ThreadPoolExecutor lightExecutor = new ThreadPoolExecutor(CPU_COUNT, CPU_COUNT, 60L, TimeUnit.SECONDS,
            lightTaskQueue);

    BlockingQueue<Runnable> heavyTaskQueue = new LinkedBlockingDeque<Runnable>();

    ThreadPoolExecutor heavyExecutor = new ThreadPoolExecutor(1, 1, 60L, TimeUnit.SECONDS, heavyTaskQueue);

    static AtomicBoolean heavyTaskRunning = new AtomicBoolean();

    public void shutDownNow() {
        lightExecutor.shutdownNow();
        heavyExecutor.shutdownNow();
    }

    public void runOrQueueLightTask(SampleLightTask lightOne) {
        lightExecutor.execute(lightOne);
    }

    public void runOrQueueHeavyTask(SampleHeavyTask heavyOne) {
        if (heavyTaskRunning.get()) {
            System.out.println("running, skipped new one: " + heavyOne);
            return;
        }
        this.heavyExecutor.execute(heavyOne);
    }

    public static void main(String[] args) throws Exception {
        Main q = new Main();
        long start = System.currentTimeMillis();

        // Run the queues for 30 seconds, add CPU-light and CPU-weight tasks
        // every second.
        while (System.currentTimeMillis() - start <= 30 * 1000L) {
            q.runOrQueueHeavyTask(new SampleHeavyTask());
            q.runOrQueueLightTask(new SampleLightTask());
            Thread.sleep(1000L);
        }

        q.shutDownNow();
    }
}

class SampleLightTask implements Runnable {
    @Override
    public void run() {
        System.out.println("I am " + this + " and running fast!");
    }

}

class SampleHeavyTask implements Runnable {
    @Override
    public void run() {
        try {
            Main.heavyTaskRunning.set(true);
            System.out.println("I am " + this + " and running quite slow!");
            final long start = System.currentTimeMillis();
            while (true) {
                // burn the CPU for ten senconds.
                if (System.currentTimeMillis() - start >= 10000L)
                    break;
            }
        } finally {
            Main.heavyTaskRunning.set(false);
        }
    }
}