| // $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; |
| } |