import java.util.Random;
class MProducer implements Runnable {
    BoundedBuffer2 b = null;
    public MProducer(BoundedBuffer2 initb) {
        b = initb;
        new Thread(this).start();
    }
    public void run() {
        double item;
        Random r = new Random();
        while (true) {
            item = r.nextDouble();
            System.out.println("produced item " + item);
            b.deposit(item);
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}
class MConsumer implements Runnable {
    BoundedBuffer2 b = null;
    public MConsumer(BoundedBuffer2 initb) {
        b = initb;
        new Thread(this).start();
    }
    public void run() {
        double item;
        while (true) {
            item = b.fetch();
            System.out.println("fetched item " + item);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                return;
            }
        }
    }
}
class MProducerConsumer {
    public static void main(String[] args) {
        BoundedBuffer2 buffer = new BoundedBuffer2();
        MProducer producer1 = new MProducer(buffer);
        MProducer producer2 = new MProducer(buffer);
        MConsumer consumer1 = new MConsumer(buffer);
        MConsumer consumer2 = new MConsumer(buffer);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            return;
        }
    }
}