/* @author j.n.magee 14/11/96 */ package concurrency.buffer; import java.awt.*; import java.applet.*; import concurrency.display.*; import concurrency.semaphore.*; /*********************SEMABUFFER*****************************/ class SemaBuffer implements Buffer { protected Object[] buf; protected int in = 0; protected int out= 0; protected int count= 0; protected int size; Semaphore full; //counts number of items Semaphore empty;//counts number of spaces SemaBuffer(int size) { this.size = size; buf = new Object[size]; full = new Semaphore(0); empty= new Semaphore(size); } synchronized public void put(Object o) throws InterruptedException { empty.down(); buf[in] = o; ++count; in=(in+1) % size; full.up(); } synchronized public Object get() throws InterruptedException{ full.down(); Object o =buf[out]; buf[out]=null; --count; out=(out+1) % size; empty.up(); return (o); } } public class NestedMonitor extends BoundedBuffer { public void start() { Buffer b = new DisplaySemaBuffer(buffDisplay,5); // Create Thread prod.start(new Producer(b)); cons.start(new Consumer(b)); } } /**************************************************************/ class DisplaySemaBuffer extends SemaBuffer { BufferCanvas disp_; DisplaySemaBuffer(BufferCanvas disp,int size) { super(size); disp_ = disp; } private void display() { char[] tmp = new char[size]; for (int i=0; i