import java.util.Vector; public class SharedBuffer { public int maxSize = 8; public Vector buffer = new Vector( maxSize ); public int i = 1; class Producer extends Thread { public void run() { while ( true ) { produceMessage(); } } } public synchronized void produceMessage() { if ( buffer.size() < maxSize ) { buffer.addElement( i ); System.out.println( "PRODUCER: added item " + i ); i++; } } class Consumer extends Thread { public void run() { while ( true ) { consumeMessage( this.getId() ); } } } // this consumeMessage() function needs to be synchronized public synchronized void consumeMessage( long threadId ) { if ( buffer.size() > 0 ) { int n = (Integer)buffer.firstElement(); buffer.removeElement( n ); System.out.println( "CONSUMER (thread " + threadId + "): consumed item " + n ); } } public void doit() { Producer p1 = new Producer(); Producer p2 = new Producer(); Consumer c1 = new Consumer(); Consumer c2 = new Consumer(); Consumer c3 = new Consumer(); p1.start(); p2.start(); c1.start(); c2.start(); c3.start(); } public static void main( String[] args ) { SharedBuffer program = new SharedBuffer(); program.doit(); } }