http://www-900.ibm.com/developerWorks/cn/java/j-prodcon/index.shtml

解决方案 »

  1.   

    package ProducerConsumer;
    import java.io.*;
    class CircularBuffer
    {
    int bufsize;
    int[] store;
    int numOfEntries=0;
    int front=0;
    int back=0;

    CircularBuffer(int n)
    {
    bufsize=n;
    store=new int[bufsize];

    }
    synchronized void put(int obj)throws Exception{
    if(numOfEntries==bufsize)
    {
    System.out.println("Producer waiting");

    wait();

    }
    store[back]=obj;
    back++;
    if(back==bufsize)  back=0;
    else {numOfEntries++;
    System.out.println("putting   "+   obj);

    notify();
    }

    }

    synchronized int get() throws Exception{
    int result=0;
    if(numOfEntries==0)
    {
    System.out.println("Consumer waiting");
    wait();
    }

    else{
    result=store[front];
    front++;
    if(front==bufsize) front=0;



    numOfEntries--;
    System.out.println("getting   "+result);//;
    notify();
    }
    return result;



    }
    }
      

  2.   

    package ProducerConsumer;
    class Consumer extends Thread
    {
    CircularBuffer cbc=null;


     Consumer(CircularBuffer cb)
    {cbc=cb;}
    public void run(){
    for(int i=0;i<=50000;i++)
    try{
    cbc.get();
    }
    catch (Exception err){

    }

    }

    }
      

  3.   

    package ProducerConsumer;
    import java.io.*;
    class ProCum{
    public static void main(String[] args){

    CircularBuffer cb=new CircularBuffer(20);

    //因为要调用的两个方法put和get是排斥,所以调用时由同一个对象调用,所以
    ?/都是cb,注意注意!!!!!!

    Producer pro=new Producer(cb);
    Consumer con=new Consumer(cb);
    //
    Thread a=null;
    Thread b=null;

    a=new Thread(pro);

    b=new Thread(con);
    b.start();
    a.start();

    }
    }