MainClass.java Source code

Java tutorial

Introduction

Here is the source code for MainClass.java

Source

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MainClass {
    public static void main(String[] args) {
        ExecutorService application = Executors.newFixedThreadPool(2);

        Buffer sharedLocation = new UnsynchronizedBuffer();

        System.out.println("Action\t\tValue\tProduced\tConsumed");
        System.out.println("------\t\t-----\t--------\t--------\n");

        try {
            application.execute(new Producer(sharedLocation));
            application.execute(new Consumer(sharedLocation));
        } catch (Exception exception) {
            exception.printStackTrace();
        }

        application.shutdown(); // terminate application when threads end
    } // end main
}

interface Buffer {
    public void set(int value);

    public int get();
}

// UnsynchronizedBuffer represents a single shared integer.
class UnsynchronizedBuffer implements Buffer {
    private int buffer = -1; // shared by producer and consumer threads

    public void set(int value) {
        System.out.printf("Producer writes\t%2d", value);
        buffer = value;
    }

    public int get() {
        System.out.printf("Consumer reads\t%2d", buffer);
        return buffer;
    }
}

class Producer implements Runnable {
    private Buffer buffer; // reference to shared object

    public Producer(Buffer shared) {
        buffer = shared;
    }

    public void run() {
        int sum = 0;

        for (int i = 1; i <= 10; i++) {
            try {
                Thread.sleep(1000);
                buffer.set(i);
                sum += i;
                System.out.printf("\t%2d\n", sum);
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
        System.out.printf("\n%s\n%s\n", "Producer done producing.", "Terminating Producer.");
    }
}

class Consumer implements Runnable {
    private Buffer buffer;

    public Consumer(Buffer shared) {
        buffer = shared;
    }

    public void run() {
        int sum = 0;

        for (int i = 1; i <= 10; i++) {
            try {
                Thread.sleep(1000);
                sum += buffer.get();
                System.out.printf("\t\t\t%2d\n", sum);
            } catch (InterruptedException exception) {
                exception.printStackTrace();
            }
        }
        System.out.printf("\n%s %d.\n%s\n", "Consumer read values totaling", sum, "Terminating Consumer.");
    }
}