Wednesday, 20 May 2015

Multiple Producer and Multiple Consumer problem solving using Semaphore!

Multiple Producer and Multiple Consumer problem solving using Semaphore!


import java.util.LinkedList;
import java.util.concurrent.Semaphore;

public class SemaphoreTest {
    static LinkedList list = new LinkedList();
    static Semaphore consumer = new Semaphore(0);
    static Semaphore producer = new Semaphore(1);

    static class Consumer extends Thread {
        String name;
        public Consumer(String name) {
            this.name = name;
        }
        public void run() {
            try {
                while (true) {
                    consumer.acquire(1);
                    producer.acquire();
                    System.out.println("Consumer name=\""+name+"\" consumed: "+list.removeFirst());
                    producer.release();
                }
            } catch (Exception x) {
                x.printStackTrace();
            }
        }
    }

    static class Producer extends Thread {
        public void run() {
            try {
                int i = 1;
                while (true) {
                    producer.acquire();
                    list.add(new Integer(i++));
                    System.out.println("produced item="+list);
                    producer.release();
                    consumer.release(1);
                    Thread.sleep(500);
                }
            } catch (Exception x) {
                x.printStackTrace();
            }
        }
    }

    public static void main(String [] args) {
        new Producer().start();
        new Consumer("Alice").start();
        new Consumer("Bob").start();
        new Consumer("Sumit").start();
        new Consumer("Sumit2").start();
        new Consumer("Sumit3").start();
        new Consumer("Sumit4").start();
    }
}