class QueueClass { int number; boolean valueset = false; synchronized int get( ) { if (valueset==false) try { wait( ); } catch (InterruptedException e) { System.out.println("InterruptedException caught"); } System.out.println( "Got: " + number); valueset = false; notify( ); return number; } synchronized void put( int number) { if (valueset==true) try { wait( ); } catch (InterruptedException e) { System.out.println("InterruptedException caught"); } this.number = number; valueset = true; System.out.println( "Put: " + number); notify( ); } } class Developer implements Runnable { QueueClass queueClass; Developer ( QueueClass queueClass) { this.queueClass = queueClass; } public void run( ) { int i = 0; for(int j=0; j<50; j++) { queueClass.put (i++); } } } class Client implements Runnable { QueueClass queueClass; Client (QueueClass queueClass) { this.queueClass = queueClass; } public void run( ) { for(int j=0; j<50; j++) { queueClass.get( ); } } } public class Caller2 { public static void main(String args[]) { QueueClass queueClass = new QueueClass( ); Developer Dev = new Developer(queueClass); Client cl = new Client (queueClass); Thread t1=new Thread(Dev); Thread t2=new Thread(cl); t1.start(); t2.start(); System.out.println("Press Control-C to stop"); } }