/**

 *

 * 共享缓冲区的接口

 *

 */

public interface Buffer {

 // 生产者使用的

  public abstract void set(int value);

 // 消费者使用的

  public abstract int get();

}

 
/**

 *

 * 消费者

 *

 */

public class Consumer extends Thread{

 /* 缓冲区 */

  private Buffer sharedLocation;

  public Consumer( Buffer shared) {

   super("Consumer");

   sharedLocation = shared;

  }

 

  public void run() {

  

  // 用于存放从缓冲区中取出的数

  int sum = 0;

   for(int count = 1; count <= 4; count++) {

  

    try {

    Thread.sleep((int)(Math.random()*3001));

    sum = sum + sharedLocation.get();

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

   }

   System.out.println(getName() + "read values totaling:" + sum +

     "./nTerminating" + getName() + ".");

    

  }

}

 

 

 
/**

 *

 * 测试入口

 *

 */

public class MainTestShareBuffer {

 

 public static void main(String[] args) {

  /* 创建缓冲区 */

  UnsynchronizedBuffer sharedLocation = new UnsynchronizedBuffer();

 

  /* 创建生产者与消费者   出生状态 */

  Producer producer = new Producer(sharedLocation);

  Consumer consumer =  new Consumer(sharedLocation);

 

  /* 进入就绪状态 */

    producer.start();

    consumer.start();

   

 

 }

 

}

 

 

 

 
/**

 *

 *  生产者

 *

 */

public class Producer extends Thread {

 // 缓冲区

 private Buffer sharedLocation;

 

 public Producer(Buffer shared) {

  super("Producer");

  sharedLocation = shared;

 }

 public void run() {

 

  for(int count = 1; count <= 4; count++){

   try {

    // 如果没有调用 sleep 方法,并且如果生产者首先执行,则生产者极有可能在消费者

    // 获得执行机会之前完成它的任务。如果消费者首先执行,则该线程极有可能 在生产

    // 获得执行机机会之前完成它的任务。

    Thread.sleep((int)(Math.random()*3001));

    // 生产

    sharedLocation.set(count);

   

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  

  }

 //err 打印错误流

  System.err.println(getName() +  "done producing." +

    "/nTerminating" + getName() + "."); //Termainat 终止

 };

 

 

}

 

 

 
/**

 *

 * 具体的缓冲区

 *

 * 含生产者和消费者线程共享的整数,两线程由 set get 方法访问整数

 *

 */

public class UnsynchronizedBuffer implements Buffer{

 /* 共享的数据 */

  private int buffer = -1;

 

  /**

   * 消费者消费一个

   */

 public int get() {

  // TODO Auto-generated method stub

  System.err.println(Thread.currentThread().getName() + "  reads  " + buffer);

  return buffer;

   

   

 }

  /**

   * 生产者生产一个

   */

 public void set(int value) {

  // TODO Auto-generated method stub

  buffer = value;

  System.err.println(Thread.currentThread().getName() + "  writes  " + value); 

 }

}