码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-07-22 15:13:22      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:dex   sum   create   while   tar   interrupt   run   pre   star   

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

 

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

标签:dex   sum   create   while   tar   interrupt   run   pre   star   

原文地址:https://www.cnblogs.com/binye-typing/p/9350021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!