/** * Adapted from The Java Tutorial * Second Edition by Campione, M. and * Walrath, K.Addison-Wesley 1998 */ class CubbyHole{ private int contents; private boolean available = false; public synchronized int get(){//synchronized method while (available == false){//wait until produced try{ wait(); } catch (InterruptedException e){ } } available = false; notifyAll();// allow put (produce) return contents;//get done } public synchronized void put(int value){//synchronized method while (available == true){//wait until consumed try{ wait(); } catch (InterruptedException e){ } } contents = value;//put done available = true; notifyAll();// allow get (consume) } } class Consumer extends Thread{ private CubbyHole cubbyhole; private int number; public Consumer(CubbyHole c, int number){ cubbyhole = c; this.number = number; } public void run(){ int value = 0; for (int i = 0; i < 10; i++){ value = cubbyhole.get(); System.out.println("Consumer #" + this.number + " got: " + value); try{// delay a bit after get (consume) to allow next put (produce) sleep((int)(Math.random() * 100)); } catch (InterruptedException e){ } } } } class Producer extends Thread{ private CubbyHole cubbyhole; private int number; public Producer(CubbyHole c, int number){ cubbyhole = c; this.number = number; } public void run(){ for (int i = 0; i < 10; i++){ cubbyhole.put(i); System.out.println("Producer #" + this.number + " put: " + i); try{//delay a bit after put (produce) to allow next get (consume) sleep((int)(Math.random() * 100)); } catch (InterruptedException e){ } } } } public class ProducerConsumerTest{ public static void main(String[] args){ CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start(); } }