import java.util.LinkedList; import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; public class ProducerConsumer { public static final int MAX_SIZE = 5; public static final int SLEEP_TIME = 5 * 100; public static class PreJava5 { public static class Consumer { private Random random = new Random(); public void consume(LinkedList<Integer> queue) { while (true) { try { synchronized (queue) { if (queue.isEmpty()) { System.out.println("Queue is empty"); queue.wait(); } else { System.out.println("Consuming something, size=" + queue.size()); queue.removeFirst(); queue.notifyAll(); } } // to simulate performing some busy tasks Thread.sleep(random.nextInt(SLEEP_TIME)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } public static class Producer { private Random random = new Random(); public void produce(LinkedList<Integer> queue) { while (true) { try { synchronized (queue) { if (queue.size() == MAX_SIZE) { System.out.println("Queue is full"); queue.wait(); } else { System.out.println("Producing something, size=" + queue.size()); queue.addLast(0); queue.notifyAll(); } } // to simulate performing some busy tasks Thread.sleep(random.nextInt(SLEEP_TIME)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } public static class Java5AndAbove { public static class Consumer { private Random random = new Random(); public void consume(BlockingQueue<Integer> queue) { while (true) { try { System.out.println("Consuming something, size=" + queue.size()); // will block if the queue is empty queue.take(); // to simulate performing some busy tasks Thread.sleep(random.nextInt(SLEEP_TIME)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } public static class Producer { private Random random = new Random(); public void produce(BlockingQueue<Integer> queue) { while (true) { try { System.out.println("Producing something, size=" + queue.size()); // will block if the queue is full queue.put(0); // to simulate performing some busy tasks Thread.sleep(random.nextInt(SLEEP_TIME)); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } } } public static void main(String[] args) { boolean preJava5 = false; if (preJava5) { final LinkedList<Integer> queue = new LinkedList<>(); final PreJava5.Producer producer = new PreJava5.Producer(); final PreJava5.Consumer consumer = new PreJava5.Consumer(); Thread t1 = new Thread(new Runnable() { @Override public void run() { producer.produce(queue); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { consumer.consume(queue); } }); t1.start(); t2.start(); } else { final BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(MAX_SIZE); final Java5AndAbove.Producer producer = new Java5AndAbove.Producer(); final Java5AndAbove.Consumer consumer = new Java5AndAbove.Consumer(); ExecutorService es1 = Executors.newSingleThreadExecutor(); ExecutorService es2 = Executors.newSingleThreadExecutor(); es1.execute(new Runnable() { @Override public void run() { producer.produce(queue); } }); es2.execute(new Runnable() { @Override public void run() { consumer.consume(queue); } }); } } }
Thursday, December 13, 2012
How to Solve Producer Consumer Problem in Java
Change the preJava5 flag to true if you are running Java 4 and below. Change preJava5 flag to true if you are running Java 5 and above.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment