import java.util.*; class Queue { // The shared buffer: static Queue store = new Queue(); private LinkedList data = new LinkedList(); public void put(Object o) { data.addFirst(o); } public Object get() { return data.removeLast(); } public int size() { return data.size(); } } class Producer extends Thread { static Random numbers = new Random(); Producer(String id) { super(id); } int genNumber() { // Generate a random number in (0, 1000) return (int)(numbers.nextDouble()*1000); } public void run() { // Generate some elements for the Queue for (;;) { int number = genNumber(); System.out.println(getName() + " producing " + number); synchronized(Queue.store) { Queue.store.put(new Integer(number)); Queue.store.notify(); } } } } class Consumer extends Thread { Consumer(String id) { super(id); } public void run() { for (;;) { synchronized(Queue.store) { while (Queue.store.size() == 0) { try { Queue.store.wait(); } catch (InterruptedException x) {} } System.out.println(getName() + " consuming " + Queue.store.get()); } } } } class CommTest { public static void main(String[] args) { // Start Producers new Producer("Producer1").start(); new Producer("Producer2").start(); // Start Consumers new Consumer("Consumer1").start(); new Consumer("Consumer2").start(); } } /* Output: Producer1 producing 289 Producer1 producing 34 Producer1 producing 975 Producer1 producing 804 Producer1 producing 913 Producer1 producing 514 Producer1 producing 94 Producer1 producing 425 Producer2 producing 863 Consumer1 consuming 289 Consumer2 consuming 34 Producer2 producing 758 Consumer1 consuming 975 Consumer2 consuming 804 Producer2 producing 274 Consumer1 consuming 913 Consumer2 consuming 514 Producer2 producing 311 Consumer1 consuming 94 Consumer2 consuming 863 Producer2 producing 997 (etc...) */ End of Listing