tekmark
9/23/2017 - 5:54 PM

[Consumer Producer Example] a java example for consumer producer problem

[Consumer Producer Example] a java example for consumer producer problem

/**
 *ConsumerProducerExample
 */
import java.util.Queue;
import java.util.Random;
import java.util.LinkedList;

public class ConsumerProducerExample {
    /**
     * Consumer 
     */
    public static class Consumer implements Runnable {
        private Queue<Integer> sharedQ;
        public Consumer (Queue<Integer> q) {
            sharedQ = q;
        }
        public void consume() throws InterruptedException {
            // keep running
            while (true) {
                synchronized(sharedQ) {
                    // while q is empty, wait();
                    while (sharedQ.isEmpty()) {
                        sharedQ.wait();
                    }
                    System.out.println(Thread.currentThread().toString() + ": consume " + sharedQ.poll());
                    // notify producer, if producer is wait.  
                    sharedQ.notify();
                }
            }
        }

        @Override
        public void run() {
            System.out.println("consumer started");
            try {
                consume();
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread() + ": " + e);
            }
        }
    }
    /**
     * Producer
     */
    public static class Producer implements Runnable {
        private Queue<Integer> sharedQ;
        private int qCapacity;
        public Producer(Queue<Integer> q, int capacity) {
            sharedQ = q;
            qCapacity = capacity;
        }
        public void produce() throws InterruptedException {
            // keep running 
            while (true) {
                Random rand = new Random();
                int v = rand.nextInt(10);
                // sleep for a random period, then produce
                Thread.sleep(v * 10);
                synchronized (sharedQ) {
                    // if reach queue's capacity, wait consumer to consume.
                    while (sharedQ.size() == qCapacity) {
                        System.out.println(Thread.currentThread().toString() + ": queue is full");
                        sharedQ.wait();
                    }
                    sharedQ.offer(v);
                    System.out.println(Thread.currentThread().toString() + ": produce " + v);
                    // notify consumer that a new object has been produced.
                    sharedQ.notify();
                }   
            }         
        }
        
        @Override
        public void run() {
            System.out.println("producer started");
            try {
                produce();
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread() + ": " + e);
            }
        }
    }

    public static void example() {
        Queue<Integer> q = new LinkedList<Integer>();
        Producer producer = new Producer(q, 2);
        Consumer consumer = new Consumer(q);
        Thread t1 = new Thread(producer);
        t1.start();
        Thread t2 = new Thread(consumer);
        t2.start();
    } 
}