我做了produce-comsume的模型
   可是不能按照要求,就是我自己控制线程,必须是生产一个,消费一个,生产一个消费一个,怎么办?
下面是三个类
public class Consumer extends Thread{
 private ShareData data;
 Consumer(ShareData data){
 this.data = data;
 }
 public void run(){
   int product=0;
   for(int i=0;i<10;i++){
   try{
    product=data.getShareData();
    System.out.println("                Consuming Num "+product);
   }catch(InterruptedException e){}
   }
 }
}
import java.util.Random;
public class Producer extends Thread{
  private ShareData data;
  Producer(ShareData data){
  this.data = data;
 }
  public void run(){
  for(int i=0;i<10;i++){
  try{
    data.setShareData(i);
    System.out.println("Producing Num " + i);
  }catch(InterruptedException e){};
   }
  
  }}
public class ShareData{
 private int data;
 private boolean produceable = true;
 public synchronized void setShareData(int data ) throws InterruptedException{
  if (!produceable){
        wait(); }
  this.data =data;
  produceable = false;
  notify();
 }
 
 public synchronized int getShareData() throws InterruptedException{
  if (produceable){
         wait(); }
  
  produceable = true;
  notify();
  return this.data;
  
 }
}

解决方案 »

  1.   

    再加个类
    public class procus
     {
     public static void main(String[] args)
     {
     ShareData ds=new ShareData();
     Consumer c=new Consumer(ds);
     Producer p=new Producer(ds);
     
     p.start();
     c.start();
     
     try{
    p.join();
    c.join();
     }catch(InterruptedException e)
     {
     
     }

     }
     }
      

  2.   

    我以前曾经写过一次,下面是完整的例子。已经测试过,没有race-condition。
    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;



    }
    }
      

  3.   


    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){

    }

    }

    }
      

  4.   

    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();

    }
    }