java:生产者与消费者随机多数量生产与消费
2016-12-30 15:16
507 查看
import java.util.ArrayList; import java.util.List; /* 4个生产者随机生产n个面包,要求每人每次最多不能超过40个,而且总共最多不能生产超过100个, 同时,有5个消费者随机消费这些面包,每人每次不能消费超过30个。 要求打印以下信息: 例如: 生产者XX 生产 6个面包 消费者XX 消费4个面包 如果满了,则打印: 已经达到100个了!请停止生产.. 如果空了,则打印: 已经吃空了!请速度生产...*/
public class Bakery {// 面包房存放面包 Bread bread;// 有面包 List<Bread> list = new ArrayList<Bread>();// 有一个list里面可以放很多面包 int holdermax = 100;// 共可以放的数量 最多不能超过100个 int count = 0; public List<Bread> getList() { return list; } /* * public void setList(List<Bread> list) { this.list = list; } * * /** 放list里面加面包的方法 * * @throws InterruptedException */ public synchronized void push(Bread bread) throws InterruptedException {// 得到一个面包 // 判断加满的时候 if (list.size() >= holdermax) { wait();// 等待,太多了,不能再放面包了 System.out.println("已有" + (list.size() + 1) + "个,已放满,请等待"); return;// 没有加return会一直走判断流程 } list.add(bread);// 加面包 notify();// 动作已做完,通知另一个线程 } /** * 放list里面取 面包的方法 * * @throws InterruptedException */ public synchronized void down() throws InterruptedException { // 判断取空的时候 if (list.size() <= 0) {// 不于1个的时候,进入if等待 wait(); System.out.println("剩余" + list.size() + "个,不多了,请等待"); return; } list.remove(0);// 减去list里面的面包数 notify();// 动作已做完,通知另一个线程 } /** * 返回一个0-100的随机数 * * @return */ public int addRandon() { int b = 0; float a = (float) Math.random() * 100;// 产生一个0-1之间的数,再*100 if(a==0){ addRandon();//不能让这个数等于0 } return b = (int) a;// 去掉小数点后面的数 } } //消费者 public class Consumer implements Runnable { // 有一个Bakery Bakery bakery; public Consumer(Bakery bakery) { super(); this.bakery = bakery; } public void reduce() { int b = 0; while (true) { try { for (int i = 0; i < bakery.addRandon(); i++) { if (i > 30) { notify(); return; } else { bakery.down(); b = i; } } System.out.println(Thread.currentThread().getName() + "消费了" + b + "个面包"); Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void run() { // TODO Auto-generated method stub reduce(); } } //生产者---------------------------------------------------- package 生产者与消费者2; public class Producer implements Runnable { // 有一个Bakery Bakery bakery; public Producer(Bakery bakery) { super(); this.bakery = bakery; } public void add() { int b = 0; while (true) {// 加上while,让他无限循环,要不然到最大数量后,就会自动停止 Bread bread = new Bread(); try { for (int i = 0; i < bakery.addRandon(); i++) {// 循环多少次,等于生产多少次 if (i > 40) { notify(); return; } else { bakery.push(bread);// 调用方法,加一个面包进去 b = i; } } System.out.println(Thread.currentThread().getName() + "生产" + b + "个面包"); Thread.sleep(300); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @Override public void run() { // TODO Auto-generated method stub add(); } } -------------------------------------------- public class Bread { }
相关文章推荐
- 一个线程作为生产者,一个线程作为消费者。生产者每生产一次,消费者就消费一次。生产者每次生产一定数量的商品,加上上次消费剩余的数量,而总数量不超过1000;总感觉代码不是很完善,求指教??
- kafka无法正常生产消费,但依旧可以创建生产者和消费者
- 生产者与消费者模型(基于单链表、环形队列、多线程、多消费多生产)
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- Kafka java api-消费者代码与消费分析、生产者消费者配置文件详解
- 编写一个多线程程序,模拟2个生产者生产产品,3个消费者消费产品。2个生产者不停的生产商品3个消费者不停的消费产品。
- 生产消费模型-多生产者vs多消费者
- 多线程实例三----多生产者多消费者(模拟kfc多生产和多消费)
- 生产者消费者问题 这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者
- Thread线程之 多生产者与多消费者模拟生产消费
- 编写一个多线程程序,模拟2个生产者生产产品,3个消费者消费产品。2个生产者不停的生产商品3个消费者不停的消费产品。
- 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
- 用JAVA 实现“生产者-消费者”问题
- java线程模拟生产者与消费者
- 生产者-消费者问题(condition)Java实现
- 消费者生产者模型-java 线程模拟
- 经典javaThead 生产者 消费者
- java生产者 消费者问题
- java多线程之生产者与消费者问题的简单模拟