//file: BadConsumer.java
import java.util.Vector;

class BadProducer 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 void putMessage(  )
      throws InterruptedException {

        while ( messages.size(  ) == MAXQUEUE ) {
            System.out.println("Producer waiting");
            //wait()
			for(int i=0; i<500000; i++);
		}
        messages.addElement( new java.util.Date().toString(  ) );
//        notify(  );
    }

    // called by BadConsumer
    public String getMessage(  )
      throws InterruptedException {

		//notify
        while ( messages.size(  ) == 0 )
			for(int i=0; i<500000; i++);
		//wait

        String message = (String)messages.firstElement(  );
        messages.removeElement( message );

        return message;
    }
}  // end of class Producer

public class BadConsumer extends Thread {
    BadProducer producer;

    BadConsumer(BadProducer 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[]) {
        BadProducer producer = new BadProducer(  );

        producer.start(  );
        new BadConsumer( producer ).start(  );
    }
}
