====== Bounded buffer in Java ====== The class Buffer can be implemented as follows. /** This class represents a bounded buffer. @author Franck van Breugel */ public class Buffer { private static final int SIZE = 10; private Object[] buffer; private int inCount; private int outCount; /** Creates an empty buffer. */ public Buffer() { this.buffer = new Object[Buffer.SIZE]; this.inCount = 0; this.outCount = 0; } /** Puts the given element in this buffer. @param element the element to be added. */ public synchronized void put(Object element) { while (this.inCount - this.outCount >= Buffer.SIZE) { this.wait(); } this.buffer[this.inCount % Buffer.SIZE] = element; this.inCount++; this.notifyAll(); } /** Removes an element from the buffer and returns it. @return an element of the buffer. */ public synchronized Object get() { while (this.incount - this.outCount <=0) { this.wait(); } Object temp = this.buffer[this.outCount % Buffer.SIZE]; this.outCount++; this.notifyAll(); return temp; } } The class Consumer can be implemented as follows. /** This class represents a consumer. @author Franck van Breugel */ public class Consumer extends Thread { private Buffer buffer; /** Creates a consumer for the given buffer. @param buffer the buffer from which the consumer consumes. */ public Consumer(Buffer buffer) { super(); this.buffer = buffer; } /** Gets 20 elements from the buffer and prints them. */ public void run() { final int MILIS_IN_SEC = 1000; final int ITERATION = 20; for (int i = 0; i < ITERATION; i++) { System.out.println((Integer) this.buffer.get()); try { Thread.sleep((long) Math.random() * MILIS_IN_SEC); } catch (InterruptedException e){} } } } The class Producer can be implemented as follows. /** This class represents a producer. @author Franck van Breugel */ public class Producer extends Thread { private Buffer buffer; /** Creates a producer for the given buffer. @param buffer the buffer from which the producer produces. */ public Producer(Buffer buffer) { super(); this.buffer = buffer; } /** */ public void run() { final int MILIS_IN_SEC = 1000; final int ITERATION = 20; for (int i = 0; i < ITERATION; i++) { this.buffer.put(new Integer(i)); try { Thread.sleep((long) Math.random() * MILIS_IN_SEC); } catch (InterruptedException e){} } } } Finally, we give an app that puts everything together. /** This app creates a buffer, a consumer and a producer. @author Franck van Breugel */ public class BufferTest { /** Creates a buffer, consumer and producer. */ public static void main(String[] args) { Buffer buffer = new Buffer(); Producer producer = new Producer(buffer); Consumer consumer = new Consumer(buffer); producer.start(); consumer.start(); } }