实现类A中队列对象的读/写方法,其中line的长度最大为10,写的数据(整数)追加到line的尾部,读操作取出队列的第一个数据。并实现生产考和消费者两个线程类,生产考往A中写数据(递增的整数),消费考从A中取出数据打打印,要支持多个生产者和消费者。

解决方案 »

  1.   

    刚好以前写过,下面是源码:
    此文章的目的在于利用线程的互斥,解决生产者消费者问题。其中使用了关键字sychronized。线程的内容可以一样,但是对应不同的内存地址。运行起来相互独立,是两个完全独立的进程。producer.java文件:package ProducerConsumer;
    class Producer extends Thread
    {
      CircularBuffer cbp=null;
     
     
     Producer(CircularBuffer cb){cbp=cb;}
     public void run(){
      for(int i=0;i<=50000;i++)
      try{
       cbp.put(i);
      }
      catch (Exception err){
       //System.
       
       }
      
      }
     // public static void main(String[] args) {}
    }
    ProCum文件: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();
     
      }
     }Consumer.java文件: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){
       
       }
      
      }
     
    }
    CircularBuffer.java 文件: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;
      
      
      
     }
     
     public static void main(String[] args)
     {
    }
     }