Java多线程,生产者,消费者回顾.简单的一条街包子铺!
2010-05-26 15:45
281 查看
一条街,有很多家包子铺,包子铺,开张的时候,都已经做好了19个包子,包子呢,是边做边卖.做1个包子,是铁定的800ms,而卖出1个包子不会超过1s(生意好).
包子铺>> 三号 <<开始"做"第[20]个包子!
包子铺>> 三号 <<包子满了,停止做包子!
包子铺>> 二号 <<开始"做"第[20]个包子!
包子铺>> 二号 <<包子满了,停止做包子!
包子铺>> 一号 <<开始"做"第[20]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 一号 <<"出售"第[0]个包子!
包子铺>> 二号 <<"出售"第[0]个包子!
包子铺>> 三号 <<"出售"第[0]个包子!
包子铺>> 三号 <<"出售"第[1]个包子!
包子铺>> 三号 <<"出售"第[2]个包子!
包子铺>> 二号 <<"出售"第[1]个包子!
包子铺>> 一号 <<"出售"第[1]个包子!
包子铺>> 三号 <<"出售"第[3]个包子!
包子铺>> 一号 <<"出售"第[2]个包子!
包子铺>> 三号 <<"出售"第[4]个包子!
包子铺>> 一号 <<"出售"第[3]个包子!
包子铺>> 三号 <<"出售"第[5]个包子!
包子铺>> 二号 <<"出售"第[2]个包子!
包子铺>> 三号 <<"出售"第[6]个包子!
包子铺>> 一号 <<"出售"第[4]个包子!
包子铺>> 三号 <<"出售"第[7]个包子!
包子铺>> 三号 <<"出售"第[8]个包子!
包子铺>> 二号 <<开始"做"第[21]个包子!
包子铺>> 三号 <<"出售"第[9]个包子!
包子铺>> 一号 <<开始"做"第[21]个包子!
包子铺>> 三号 <<"出售"第[10]个包子!
包子铺>> 二号 <<开始"做"第[22]个包子!
包子铺>> 三号 <<"出售"第[11]个包子!
包子铺>> 一号 <<开始"做"第[22]个包子!
包子铺>> 二号 <<开始"做"第[23]个包子!
包子铺>> 二号 <<包子满了,停止做包子!
包子铺>> 二号 <<"出售"第[3]个包子!
包子铺>> 二号 <<"出售"第[4]个包子!
包子铺>> 一号 <<开始"做"第[23]个包子!
包子铺>> 三号 <<"出售"第[12]个包子!
包子铺>> 一号 <<开始"做"第[24]个包子!
包子铺>> 三号 <<开始"做"第[21]个包子!
包子铺>> 二号 <<"出售"第[5]个包子!
包子铺>> 一号 <<开始"做"第[25]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 三号 <<开始"做"第[22]个包子!
包子铺>> 二号 <<"出售"第[6]个包子!
包子铺>> 二号 <<"出售"第[7]个包子!
包子铺>> 三号 <<开始"做"第[23]个包子!
包子铺>> 一号 <<"出售"第[5]个包子!
包子铺>> 一号 <<"出售"第[6]个包子!
包子铺>> 二号 <<"出售"第[8]个包子!
包子铺>> 三号 <<开始"做"第[24]个包子!
包子铺>> 一号 <<"出售"第[7]个包子!
包子铺>> 一号 <<"出售"第[8]个包子!
包子铺>> 二号 <<"出售"第[9]个包子!
包子铺>> 二号 <<"出售"第[10]个包子!
包子铺>> 二号 <<"出售"第[11]个包子!
包子铺>> 二号 <<"出售"第[12]个包子!
包子铺>> 三号 <<开始"做"第[25]个包子!
包子铺>> 一号 <<"出售"第[9]个包子!
包子铺>> 二号 <<开始"做"第[24]个包子!
包子铺>> 三号 <<开始"做"第[26]个包子!
包子铺>> 一号 <<开始"做"第[26]个包子!
包子铺>> 二号 <<开始"做"第[25]个包子!
包子铺>> 三号 <<"出售"第[13]个包子!
包子铺>> 一号 <<开始"做"第[27]个包子!
包子铺>> 三号 <<"出售"第[14]个包子!
包子铺>> 二号 <<开始"做"第[26]个包子!
包子铺>> 三号 <<"出售"第[15]个包子!
包子铺>> 一号 <<开始"做"第[28]个包子!
包子铺>> 三号 <<"出售"第[16]个包子!
包子铺>> 二号 <<开始"做"第[27]个包子!
包子铺>> 一号 <<开始"做"第[29]个包子!
包子铺>> 三号 <<"出售"第[17]个包子!
包子铺>> 二号 <<开始"做"第[28]个包子!
包子铺>> 三号 <<"出售"第[18]个包子!
包子铺>> 一号 <<开始"做"第[30]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 一号 <<"出售"第[10]个包子!
package book.thread; import java.util.List; import java.util.Vector; /** * 包子铺 * * @author Vicky * */ public class WaitNotify2 { static class Shop implements Runnable { private boolean isRunning = false; private String name; /** 记录今天做的总共的包子 * */ private int count = 0; /** 做包子的任务 * */ private Thread subThread1 = null; /** 卖包子的任务 * */ private Thread subThread2 = null; /** 包子铺中的包子 * */ private List<Integer> baozis = new Vector<Integer>(); public Shop(String name) { super(); this.name = name; initShop(); } /** * 初始化包子铺 */ private void initShop() { for (int i = 1; i < 20; i++) { baozis.add(count++); } } /** * 做包子,每秒做1个包子 */ public void makeBaozi() { subThread1 = new Thread() { @Override public void run() { while (baozis.size() < 20 && isRunning) { synchronized (baozis) { try { Thread.sleep(800); // 800毫秒才能做1个包子 System.out.println("包子铺>> " + name + " <<开始/"做/"第[" + ++count + "]个包子!"); baozis.add(count); if (baozis.size() >= 20) { System.out.println("包子铺>> " + name + " <<包子满了,停止做包子!"); baozis.wait(); } else { baozis.notifyAll(); // 又做了1个包子,又可以卖包子了 } } catch (InterruptedException e) { e.printStackTrace(); } } } } }; subThread1.start(); } /** * 出售包子,0.5秒卖出一个包子 */ public void sellBaozi() { subThread2 = new Thread() { @Override public void run() { while (baozis.size() > 0 && isRunning) { synchronized (baozis) { try { Thread.sleep((long) (Math.random() * 1000)); // 少于1秒就可以卖出1个包子 System.out.println("包子铺>> " + name + " <</"出售/"第[" + baozis.get(0) + "]个包子!"); baozis.remove(0); if (baozis.size() < 1) { System.out.println("包子铺>> " + name + " <<没包子可以卖了,等待做包子!"); baozis.wait(); } else { baozis.notifyAll(); // 卖掉了1个包子,那么仓库又可以做了! } } catch (InterruptedException e) { e.printStackTrace(); } } } } }; subThread2.start(); } public void setRunning(boolean isRunning) { this.isRunning = isRunning; Thread thread = new Thread(this); thread.start(); } public void openShop() { isRunning = true; Thread thread = new Thread(this); thread.start(); } public void run() { makeBaozi(); sellBaozi(); } } public static void main(String[] args) { Shop shop = new Shop("一号"); shop.openShop(); Shop shop2 = new Shop("二号"); shop2.openShop(); Shop shop3 = new Shop("三号"); shop3.openShop(); } }
包子铺>> 三号 <<开始"做"第[20]个包子!
包子铺>> 三号 <<包子满了,停止做包子!
包子铺>> 二号 <<开始"做"第[20]个包子!
包子铺>> 二号 <<包子满了,停止做包子!
包子铺>> 一号 <<开始"做"第[20]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 一号 <<"出售"第[0]个包子!
包子铺>> 二号 <<"出售"第[0]个包子!
包子铺>> 三号 <<"出售"第[0]个包子!
包子铺>> 三号 <<"出售"第[1]个包子!
包子铺>> 三号 <<"出售"第[2]个包子!
包子铺>> 二号 <<"出售"第[1]个包子!
包子铺>> 一号 <<"出售"第[1]个包子!
包子铺>> 三号 <<"出售"第[3]个包子!
包子铺>> 一号 <<"出售"第[2]个包子!
包子铺>> 三号 <<"出售"第[4]个包子!
包子铺>> 一号 <<"出售"第[3]个包子!
包子铺>> 三号 <<"出售"第[5]个包子!
包子铺>> 二号 <<"出售"第[2]个包子!
包子铺>> 三号 <<"出售"第[6]个包子!
包子铺>> 一号 <<"出售"第[4]个包子!
包子铺>> 三号 <<"出售"第[7]个包子!
包子铺>> 三号 <<"出售"第[8]个包子!
包子铺>> 二号 <<开始"做"第[21]个包子!
包子铺>> 三号 <<"出售"第[9]个包子!
包子铺>> 一号 <<开始"做"第[21]个包子!
包子铺>> 三号 <<"出售"第[10]个包子!
包子铺>> 二号 <<开始"做"第[22]个包子!
包子铺>> 三号 <<"出售"第[11]个包子!
包子铺>> 一号 <<开始"做"第[22]个包子!
包子铺>> 二号 <<开始"做"第[23]个包子!
包子铺>> 二号 <<包子满了,停止做包子!
包子铺>> 二号 <<"出售"第[3]个包子!
包子铺>> 二号 <<"出售"第[4]个包子!
包子铺>> 一号 <<开始"做"第[23]个包子!
包子铺>> 三号 <<"出售"第[12]个包子!
包子铺>> 一号 <<开始"做"第[24]个包子!
包子铺>> 三号 <<开始"做"第[21]个包子!
包子铺>> 二号 <<"出售"第[5]个包子!
包子铺>> 一号 <<开始"做"第[25]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 三号 <<开始"做"第[22]个包子!
包子铺>> 二号 <<"出售"第[6]个包子!
包子铺>> 二号 <<"出售"第[7]个包子!
包子铺>> 三号 <<开始"做"第[23]个包子!
包子铺>> 一号 <<"出售"第[5]个包子!
包子铺>> 一号 <<"出售"第[6]个包子!
包子铺>> 二号 <<"出售"第[8]个包子!
包子铺>> 三号 <<开始"做"第[24]个包子!
包子铺>> 一号 <<"出售"第[7]个包子!
包子铺>> 一号 <<"出售"第[8]个包子!
包子铺>> 二号 <<"出售"第[9]个包子!
包子铺>> 二号 <<"出售"第[10]个包子!
包子铺>> 二号 <<"出售"第[11]个包子!
包子铺>> 二号 <<"出售"第[12]个包子!
包子铺>> 三号 <<开始"做"第[25]个包子!
包子铺>> 一号 <<"出售"第[9]个包子!
包子铺>> 二号 <<开始"做"第[24]个包子!
包子铺>> 三号 <<开始"做"第[26]个包子!
包子铺>> 一号 <<开始"做"第[26]个包子!
包子铺>> 二号 <<开始"做"第[25]个包子!
包子铺>> 三号 <<"出售"第[13]个包子!
包子铺>> 一号 <<开始"做"第[27]个包子!
包子铺>> 三号 <<"出售"第[14]个包子!
包子铺>> 二号 <<开始"做"第[26]个包子!
包子铺>> 三号 <<"出售"第[15]个包子!
包子铺>> 一号 <<开始"做"第[28]个包子!
包子铺>> 三号 <<"出售"第[16]个包子!
包子铺>> 二号 <<开始"做"第[27]个包子!
包子铺>> 一号 <<开始"做"第[29]个包子!
包子铺>> 三号 <<"出售"第[17]个包子!
包子铺>> 二号 <<开始"做"第[28]个包子!
包子铺>> 三号 <<"出售"第[18]个包子!
包子铺>> 一号 <<开始"做"第[30]个包子!
包子铺>> 一号 <<包子满了,停止做包子!
包子铺>> 一号 <<"出售"第[10]个包子!
相关文章推荐
- Java多线程实现简单生产者消费者模式
- java多线程之生产者与消费者问题的简单模拟
- Java多线程之——生产者、消费者简单实现
- 使用线程完成简单的生产者和消费者
- 分布式Web应用----基于Socket+动态代理实现简单RPC 生产者消费者模型
- java多线程---等待/唤醒以及生产者消费者经典同步synchronized的实现
- 【消息队列】ActiveMQ的简单实例 - 生产者消费者模式
- Java多线程之并发协作生产者消费者设计模式
- linux下c++实现简单的生产者消费者队列模式
- java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)
- 回顾生产者/消费者问题下产生的java多线程(二)
- Java简单实现生产者消费者问题(源自2015年阿里巴巴实习生校园招聘)
- Go 消费者和生产者的简单例子
- java 编码实现简单的生产者-消费者模式
- 4.利用python生成器实现简单的“生产者消费者”模型
- java多线程(同步和死锁,生产者和消费者问题)
- Ruby简单的生产者,消费者模式的实现
- 操作系统 简单的单生产者单消费者问题
- java多线程(同步与死锁问题,生产者与消费者问题)
- 一个简单的生产者与消费者的多线程例子(一):简单的框架