blob: 1d54695aba70129d2045221adda6d1a0915d4c53 [file] [log] [blame]
// $Id: prodcons.java,v 1.1 2004-05-23 07:14:28 bfulgham Exp $
// http://www.bagley.org/~doug/shootout/
// Producer-Consumer Example by Bill Lear
// Adapted from http://java.sun.com/docs/books/tutorial/essential/threads
public class prodcons {
private class CubbyHole {
private int m_contents;
private boolean m_available = false;
public synchronized int get() {
while (m_available == false) {
try {
wait();
} catch (InterruptedException e) { }
}
m_available = false;
notifyAll();
return m_contents;
}
public synchronized void put(int value) {
while (m_available == true) {
try {
wait();
} catch (InterruptedException e) { }
}
m_contents = value;
m_available = true;
notifyAll();
}
}
private class Producer extends Thread {
private CubbyHole m_cubbyhole;
private int m_count;
public Producer(CubbyHole c, int count) {
m_cubbyhole = c;
m_count = count;
}
public void run() {
for (int i = 0; i < m_count; i++) {
m_cubbyhole.put(i);
++m_produced;
}
}
}
private class Consumer extends Thread {
private CubbyHole m_cubbyhole;
private int m_count;
public Consumer(CubbyHole c, int count) {
m_cubbyhole = c;
m_count = count;
}
public void run() {
int value = 0;
for (int i = 0; i < m_count; i++) {
value = m_cubbyhole.get();
++m_consumed;
}
}
}
public void run() {
m_producer.start();
m_consumer.start();
try { m_producer.join(); } catch (InterruptedException e) { }
try { m_consumer.join(); } catch (InterruptedException e) { }
System.out.println(m_produced + " " + m_consumed);
}
public prodcons(int count) {
CubbyHole m_cubbyhole = new CubbyHole();
m_producer = new Producer(m_cubbyhole, count);
m_consumer = new Consumer(m_cubbyhole, count);
}
public static void main(String[] args) {
int count = 1;
try { count = Integer.parseInt(args[0]); } catch (Exception e) { }
new prodcons(count).run();
}
private Producer m_producer;
private Consumer m_consumer;
private int m_produced = 0;
private int m_consumed = 0;
}