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();
  }
}