多线程编程实践——实现生产者、消费者模型

class Clerk {
  private int products;
  private int maximum;      // 最大储货量
  public Clerk(int maxmum) {
    this.maximum = maxmum;
  }
  public synchronized void addProduct() {
    if (products >= maximum) {
      try {
        wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    } else {
      products++;
      System.out.println(Thread.currentThread().getName() + "到货第 " + products + "个产品");
      notifyAll();
    }
  }
  public synchronized void saleProduct() {
    if (products > 0) {
      System.out.println(Thread.currentThread().getName() + "买走第 " + products + "个产品");
      products--;
      notifyAll();
    } else {
      try {
        wait();
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

class Producer implements Runnable{
  private Clerk clerk;
  public Producer(Clerk clerk) {
    this.clerk = clerk;
  }
  public void run() {
    while (true) {
      clerk.addProduct();
      try {
        Thread.currentThread().sleep(1);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}
class Consumer implements Runnable {
  private Clerk clerk;
  public Consumer(Clerk clerk) {
    this.clerk = clerk;
  }
  public void run() {
    while (true) {
      clerk.saleProduct();
      try {
        Thread.currentThread().sleep(10);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

/**
 * Created by bruce on 2018/7/22.
 */
public class ProducerAndConsumer {
  public static void main(String[] args) {
    Clerk clerk = new Clerk(20);
    Thread t1 = new Thread(new Producer(clerk));
    Thread t2 = new Thread(new Consumer(clerk));
    Thread t3 = new Thread(new Consumer(clerk));
    Thread t4 = new Thread(new Consumer(clerk));
    t1.setName("生产者");
    t2.setName("消费者1");
    t3.setName("消费者2");
    t4.setName("消费者3");
    t1.start();
    t2.start();
    t3.start();
    t4.start();
  }
}

 

posted @ 2018-07-22 14:00  笑叹词穷  阅读(301)  评论(0编辑  收藏  举报