ProducerComsumer.java Source code

Java tutorial

Introduction

Here is the source code for ProducerComsumer.java

Source

public class ProducerComsumer extends Object {
    private Object slot;

    public ProducerComsumer() {
        slot = null; // null indicates empty
    }

    public synchronized void putIn(Object obj) throws InterruptedException {

        while (slot != null) {
            wait();
        }

        slot = obj; // put object into slot
        notifyAll(); // signal that slot has been filled
    }

    public synchronized Object takeOut() throws InterruptedException {

        while (slot == null) {
            wait(); // wait while slot is empty
        }

        Object obj = slot;
        slot = null; // mark slot as empty
        notifyAll(); // signal that slot is empty
        return obj;
    }

    public static void main(String[] args) {
        final ProducerComsumer ch = new ProducerComsumer();

        Runnable runA = new Runnable() {
            public void run() {
                try {
                    String str;
                    Thread.sleep(500);

                    str = "multithreaded";
                    ch.putIn(str);
                    str = "programming";
                    ch.putIn(str);

                    str = "with Java";
                    ch.putIn(str);
                } catch (InterruptedException x) {
                    x.printStackTrace();
                }
            }
        };

        Runnable runB = new Runnable() {
            public void run() {
                try {
                    Object obj;

                    obj = ch.takeOut();
                    System.out.println("in run() - just took out: '" + obj + "'");

                    Thread.sleep(500);

                    obj = ch.takeOut();
                    System.out.println("in run() - just took out: '" + obj + "'");

                    obj = ch.takeOut();
                    System.out.println("in run() - just took out: '" + obj + "'");
                } catch (InterruptedException x) {
                    x.printStackTrace();
                }
            }
        };

        Thread threadA = new Thread(runA, "threadA");
        threadA.start();

        Thread threadB = new Thread(runB, "threadB");
        threadB.start();
    }

}