//file: Consumer.java import java.util.Vector; public class Consumer extends Thread { Producer producer; Consumer(Producer p) { producer = p; } public void run( ) { try { while ( true ) { String message = producer.getMessage( ); System.out.println("Got message: " + message); sleep( 2000 ); } } catch( InterruptedException e ) { } } public static void main(String args[]) { Producer producer = new Producer( ); producer.start( ); new Consumer( producer ).start( ); } } //import java.util.*; class Producer extends Thread { static final int MAXQUEUE = 5; private Vector messages = new Vector( ); public void run( ) { try { while ( true ) { putMessage( ); sleep( 1000 ); } } catch( InterruptedException e ) { } } private synchronized void putMessage( ) throws InterruptedException { while ( messages.size( ) == MAXQUEUE ) { System.out.println("Producer queue full"); wait( ); // System.out.println("post wait()"); } messages.addElement( new java.util.Date().toString( ) ); notify( ); } // called by Consumer public synchronized String getMessage( ) throws InterruptedException { // not necessary if clause, but it's a better practice // if (messages.size() == 0) notifyAll( ); // System.out.println("Post notify"); while ( messages.size( ) == 0 ) wait( ); String message = (String)messages.firstElement( ); messages.removeElement( message ); return message; } } // end of class Producer