多線程編程實踐——實現生產者、消費者模型

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();
  }
}
相關文章
相關標籤/搜索