新建一个Break类,表示食物数量。

public class Break {
public static final int MAX = 10; //最多一次性煮十个面包
Stack<Integer> stack = new Stack<Integer>();
public static int food_count = 0; //统计食物的个数 //做面包
public synchronized void make_food(int number){
stack.push(number);
food_count++;
} //吃食物
public synchronized int eat_food(){
food_count--;
return stack.pop();
}
}

  在创建一个厨房类,为了制作食物或者是消耗食物,若食物没有了,则消费者进入wait(),生产者开始制作食物,随后唤醒等待的消费者。

public class Kitchen {
private Break food ;
public static int people1_eatnumber = 0;//第一个人吃的面包数量
public static int people2_eatnumber = 0;//第二个人吃的面包数量
public static final int TOTOAL_NUM = 100;//总共做的面包数量
public static int icount = 1;//统计做过的面包数量 public Kitchen(Break food){
this.food = food;
} //做面包的方法
public synchronized void make(){
if(food.food_count<10){//锅是不是满了
food.make_food(Kitchen.icount);
System.out.println("做完了第"+Kitchen.icount+"个食物。");
Kitchen.icount++;
notifyAll();//食物有了,找两个人来吃面包
}else{
System.out.println("锅已经装满,一次性装十个,等待两人吃食物。");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//进入阻塞状态,等待消费者唤醒
}
} //吃面包的方法
public synchronized void eat(){
if(food.food_count>0){
int temp = food.eat_food();//吃掉面包的编号
System.out.println(Thread.currentThread().getName()+"吃掉了第"+temp+"个食物");
if(Thread.currentThread().getName().equals("一号")){
people1_eatnumber++;
}else{
people2_eatnumber++;
}
notifyAll(); //唤醒继续做面包
}else{
System.out.println("食物吃完了,等待重新烹饪。");
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

  下面进入消费者和生产者类的构造,传递给一个Kitchen对象,其中消费者调用Kitchen类中的吃方法。

public class consumer implements Runnable {
Kitchen kitchen; public consumer(Kitchen kitchen){
this.kitchen = kitchen;
} @Override
public void run() {
// TODO Auto-generated method stub
while(true){
if(kitchen.icount>100&&Break.food_count<=0){
break;
}
try{
kitchen.eat();
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
}
}

  然而生产者则是调用了Kitchen对象中的制作方法。

public class product implements Runnable {
private Kitchen kitchen;
public product(Kitchen kitchen){
this.kitchen = kitchen;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
//结束这个线程
if(Kitchen.icount > 100){
break;
}
try{
kitchen.make();
Thread.sleep(100);
}catch(Exception e){
e.printStackTrace();
}
}
System.out.println("厨房食物材料已经做完。");
}
}

  下面开始写主类,包括了main方法,启动程序,创建一个test类,实现:

public class test {
public static void main(String[] args){
Break brake = new Break();
Kitchen kitchen = new Kitchen(brake);
product p = new product(kitchen);
consumer c1 = new consumer(kitchen);
consumer c2 = new consumer(kitchen); Thread food = new Thread(p,"食物");
Thread people1 = new Thread(c1,"一号");
Thread people2 = new Thread(c2,"二号"); food.start();
people1.start();
people2.start(); try{
food.join();
people1.join();
people2.join();
}catch(Exception e){
e.printStackTrace();
} System.out.println("一号吃了"+Kitchen.people1_eatnumber);
System.out.println("二号吃了"+Kitchen.people2_eatnumber);
}
}

输出结果如下:

做完了第1个食物。
二号吃掉了第1个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第2个食物。
一号吃掉了第2个食物
食物吃完了,等待重新烹饪。
做完了第3个食物。
一号吃掉了第3个食物
食物吃完了,等待重新烹饪。
做完了第4个食物。
一号吃掉了第4个食物
做完了第5个食物。
二号吃掉了第5个食物
食物吃完了,等待重新烹饪。
做完了第6个食物。
二号吃掉了第6个食物
食物吃完了,等待重新烹饪。
做完了第7个食物。
二号吃掉了第7个食物
做完了第8个食物。
一号吃掉了第8个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第9个食物。
一号吃掉了第9个食物
食物吃完了,等待重新烹饪。
做完了第10个食物。
一号吃掉了第10个食物
做完了第11个食物。
二号吃掉了第11个食物
食物吃完了,等待重新烹饪。
做完了第12个食物。
二号吃掉了第12个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第13个食物。
一号吃掉了第13个食物
做完了第14个食物。
二号吃掉了第14个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第15个食物。
一号吃掉了第15个食物
做完了第16个食物。
二号吃掉了第16个食物
食物吃完了,等待重新烹饪。
做完了第17个食物。
二号吃掉了第17个食物
食物吃完了,等待重新烹饪。
做完了第18个食物。
二号吃掉了第18个食物
食物吃完了,等待重新烹饪。
做完了第19个食物。
二号吃掉了第19个食物
食物吃完了,等待重新烹饪。
做完了第20个食物。
二号吃掉了第20个食物
食物吃完了,等待重新烹饪。
做完了第21个食物。
二号吃掉了第21个食物
食物吃完了,等待重新烹饪。
做完了第22个食物。
二号吃掉了第22个食物
食物吃完了,等待重新烹饪。
做完了第23个食物。
二号吃掉了第23个食物
食物吃完了,等待重新烹饪。
做完了第24个食物。
二号吃掉了第24个食物
食物吃完了,等待重新烹饪。
做完了第25个食物。
二号吃掉了第25个食物
食物吃完了,等待重新烹饪。
做完了第26个食物。
二号吃掉了第26个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第27个食物。
一号吃掉了第27个食物
食物吃完了,等待重新烹饪。
做完了第28个食物。
一号吃掉了第28个食物
食物吃完了,等待重新烹饪。
做完了第29个食物。
一号吃掉了第29个食物
做完了第30个食物。
二号吃掉了第30个食物
食物吃完了,等待重新烹饪。
做完了第31个食物。
二号吃掉了第31个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第32个食物。
一号吃掉了第32个食物
食物吃完了,等待重新烹饪。
做完了第33个食物。
一号吃掉了第33个食物
食物吃完了,等待重新烹饪。
做完了第34个食物。
一号吃掉了第34个食物
做完了第35个食物。
二号吃掉了第35个食物
食物吃完了,等待重新烹饪。
做完了第36个食物。
二号吃掉了第36个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第37个食物。
一号吃掉了第37个食物
食物吃完了,等待重新烹饪。
做完了第38个食物。
一号吃掉了第38个食物
食物吃完了,等待重新烹饪。
做完了第39个食物。
一号吃掉了第39个食物
做完了第40个食物。
二号吃掉了第40个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第41个食物。
一号吃掉了第41个食物
做完了第42个食物。
二号吃掉了第42个食物
做完了第43个食物。
二号吃掉了第43个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第44个食物。
一号吃掉了第44个食物
食物吃完了,等待重新烹饪。
做完了第45个食物。
一号吃掉了第45个食物
做完了第46个食物。
二号吃掉了第46个食物
食物吃完了,等待重新烹饪。
做完了第47个食物。
二号吃掉了第47个食物
食物吃完了,等待重新烹饪。
做完了第48个食物。
二号吃掉了第48个食物
食物吃完了,等待重新烹饪。
做完了第49个食物。
二号吃掉了第49个食物
食物吃完了,等待重新烹饪。
做完了第50个食物。
二号吃掉了第50个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第51个食物。
一号吃掉了第51个食物
食物吃完了,等待重新烹饪。
做完了第52个食物。
一号吃掉了第52个食物
做完了第53个食物。
二号吃掉了第53个食物
做完了第54个食物。
一号吃掉了第54个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第55个食物。
做完了第56个食物。
二号吃掉了第56个食物
一号吃掉了第55个食物
做完了第57个食物。
一号吃掉了第57个食物
食物吃完了,等待重新烹饪。
做完了第58个食物。
一号吃掉了第58个食物
做完了第59个食物。
二号吃掉了第59个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第60个食物。
一号吃掉了第60个食物
做完了第61个食物。
二号吃掉了第61个食物
食物吃完了,等待重新烹饪。
做完了第62个食物。
二号吃掉了第62个食物
食物吃完了,等待重新烹饪。
做完了第63个食物。
二号吃掉了第63个食物
食物吃完了,等待重新烹饪。
做完了第64个食物。
二号吃掉了第64个食物
食物吃完了,等待重新烹饪。
做完了第65个食物。
二号吃掉了第65个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第66个食物。
做完了第67个食物。
二号吃掉了第67个食物
一号吃掉了第66个食物
做完了第68个食物。
一号吃掉了第68个食物
食物吃完了,等待重新烹饪。
做完了第69个食物。
一号吃掉了第69个食物
食物吃完了,等待重新烹饪。
做完了第70个食物。
一号吃掉了第70个食物
做完了第71个食物。
二号吃掉了第71个食物
食物吃完了,等待重新烹饪。
做完了第72个食物。
二号吃掉了第72个食物
食物吃完了,等待重新烹饪。
做完了第73个食物。
二号吃掉了第73个食物
食物吃完了,等待重新烹饪。
食物吃完了,等待重新烹饪。
做完了第74个食物。
一号吃掉了第74个食物
食物吃完了,等待重新烹饪。
做完了第75个食物。
一号吃掉了第75个食物
做完了第76个食物。
二号吃掉了第76个食物
食物吃完了,等待重新烹饪。
做完了第77个食物。
二号吃掉了第77个食物
食物吃完了,等待重新烹饪。
做完了第78个食物。
二号吃掉了第78个食物
食物吃完了,等待重新烹饪。
做完了第79个食物。
二号吃掉了第79个食物
食物吃完了,等待重新烹饪。
做完了第80个食物。
二号吃掉了第80个食物
食物吃完了,等待重新烹饪。
做完了第81个食物。
二号吃掉了第81个食物
食物吃完了,等待重新烹饪。
做完了第82个食物。
二号吃掉了第82个食物
食物吃完了,等待重新烹饪。
做完了第83个食物。
二号吃掉了第83个食物
食物吃完了,等待重新烹饪。
做完了第84个食物。
二号吃掉了第84个食物
食物吃完了,等待重新烹饪。
做完了第85个食物。
二号吃掉了第85个食物
食物吃完了,等待重新烹饪。
做完了第86个食物。
二号吃掉了第86个食物
食物吃完了,等待重新烹饪。
做完了第87个食物。
二号吃掉了第87个食物
食物吃完了,等待重新烹饪。
做完了第88个食物。
二号吃掉了第88个食物
做完了第89个食物。
二号吃掉了第89个食物
食物吃完了,等待重新烹饪。
做完了第90个食物。
二号吃掉了第90个食物
食物吃完了,等待重新烹饪。
做完了第91个食物。
二号吃掉了第91个食物
食物吃完了,等待重新烹饪。
做完了第92个食物。
二号吃掉了第92个食物
食物吃完了,等待重新烹饪。
做完了第93个食物。
二号吃掉了第93个食物
食物吃完了,等待重新烹饪。
做完了第94个食物。
二号吃掉了第94个食物
食物吃完了,等待重新烹饪。
做完了第95个食物。
二号吃掉了第95个食物
食物吃完了,等待重新烹饪。
做完了第96个食物。
二号吃掉了第96个食物
食物吃完了,等待重新烹饪。
做完了第97个食物。
二号吃掉了第97个食物
食物吃完了,等待重新烹饪。
做完了第98个食物。
二号吃掉了第98个食物
食物吃完了,等待重新烹饪。
做完了第99个食物。
二号吃掉了第99个食物
食物吃完了,等待重新烹饪。
做完了第100个食物。
二号吃掉了第100个食物
厨房食物材料已经做完。
一号吃了33
二号吃了67

Java程序设计之消费者和生产者的更多相关文章

  1. [Java基础] java多线程关于消费者和生产者

    多线程: 生产与消费 1.生产者Producer生产produce产品,并将产品放到库存inventory里:同时消费者Consumer从库存inventory里消费consume产品. 2.库存in ...

  2. java 模拟实现消费者和生产者问题

    题目要求 用java代码模拟实现:一个人不断往箱子里放苹果,另一个人不断从箱子里取苹果,箱子只能放5个苹果,苹果数量无限.要求不使用java.util.concurrent包中的类. 思路 这道题主要 ...

  3. Java笔记1 : 在生产者消费者模式中,线程通信与共享数据,死锁问题与解决办法

    本例定义了4个类,这里说一下,方便下面讲解.分别是Product(产品),Producer(生产者),Consumer(消费者), Test(测试类). 多线程之间通信与共享数据只要引用同一内存区域就 ...

  4. java线程之多个生产者消费者2.0

    上一节中,通过while和notifyAll解决了多个生产者,消费者对共享资源的访问问题,现在开始升级 但是,仍然有改进之处,主要体现在两点: 1)使用新版本1.5开始后的锁Lock解决,目的将其全部 ...

  5. Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例

    Java阻塞队列(BlockingQueue)实现 生产者/消费者 示例 本文由 TonySpark 翻译自 Javarevisited.转载请参见文章末尾的要求. Java.util.concurr ...

  6. java 多线程并发系列之 生产者消费者模式的两种实现

    在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据 ...

  7. java并发:初探消费者和生产者模式

    消费者和生产者模式 用继承Thread方式,用wait和notifyAll方法实现. 消费者和生产者模式的特点 1. 什么时候生产:仓库没有满的时候,生产者这可以生产,消费者也可以消费,仓库满的时候停 ...

  8. java多线程-消费者和生产者模式

    /* * 多线程-消费者和生产者模式 * 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象 * */ /*资源类中定义了name( ...

  9. Java多线程消费者、生产者的基本思路

    多线程主要考察的就是 线程的同步控制   生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了 ThreadOne.ThreadTwo同时运行,添加一个变量在一个公共类(下边的Funct ...

随机推荐

  1. Oracle取消用户连续登录失败次数限制

    当用户连续登录失败次数过多时,Oracle会锁定该用户,“FAILED_LOGIN_ATTEMPTS”用于设置最大次数,超过该值则锁定该帐号. 要取消用户连续登录失败次数的限制可以按照以下方法操作: ...

  2. Linux安装JDK1.7

    发表此篇文章纯属本人愚钝,希望以后再安装JDK不要走那么多曲折的路,也希望可以给后人借鉴. 1.以下以JDK1.7为例 具体官网地址:http://www.oracle.com/technetwork ...

  3. 2>&1 linux

    2>&1使用 2>&1使用 一 相关知识 1)默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |).2)默认地,标准的输出为终端(terminal),但是也可 ...

  4. IT基础架构规划方案二(计算机系统与机房规划规划)

    计算机系统规划       服务器硬件选型规划方案       根据对某集团的实际调研,获取了企业业务应用系统的建设情况,随着企业信息化建设的推进,需要对各种信息化管理系统和应用系统的服务器选型进行选 ...

  5. 关于Lind.DDD.Api客户端的使用与知识分享

    回到目录 关于Lind.DDD.Api的使用与客户端的调用 作者:张占岭 花名:仓储大叔 框架:Lind.DDD,Lind.DDD.Api 目录 Api里注册全局校验特性 1 Api中设置全局的Cor ...

  6. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色

    ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    ...

  7. JavaScript的几种Math函数,random(),ceil(),round(),floor()

    1.Math.random():返回 0 ~ 1 之间的随机数.2.Math.ceil():返回值:返回大于或等于x,并且与之最接近的整数(如果x是正数,则把小数"入":如果x是负 ...

  8. JavaScript-数组去重由慢到快由繁到简

    indexOf去重 Array.prototype.unique1 = function() { var arr = []; for (var i = 0; i < this.length; i ...

  9. 你的USB设备还安全吗?USB的安全性已从根本上被打破!

    前言: USB设备使用方便,但也可能被用来携带恶意软件.病毒,感染计算机系统.通过禁用自动播放功能.杀毒软件查杀.不定期的对设备进行格式化等操作可以确保它是干净的.但它存在的安全问题要比我们想象的更深 ...

  10. 自定义加载loading view动画组件的使用。

    在github上找的一个有点酷炫的loading动画https://github.com/Fichardu/CircleProgress 我写写使用步骤 自定义view(CircleProgress  ...