package com.shopping.test;public class ShaoKao {//串
    String chuan;//肉
    String rou;//烧烤的状态,初始状态为没有烧烤boolean flag = false;public String getChuan() {return chuan;}public void setChuan(String chuan) {this.chuan = chuan;}public String getRou() {return rou;}public void setRou(String rou) {this.rou = rou;}public boolean isFlag() {return flag;}public void setFlag(boolean flag) {this.flag = flag;}
}

下面是生产者

package com.shopping.test;/** 注意:*     烧烤铺线程和吃货线程关系--->通信(互斥)*     必须使用同步技术保证两个线程只能有一个在执行*  锁对象必须保证唯一,可以使用烧烤对象作为锁对象*  烧烤铺类和吃货类就需要把烧烤对象作为参数传进去*  1. 需要在成员位置创建一个烧烤变量*  2. 使用带参数构造方法,为这个烧烤变量赋值*/
public class ShaoKaoPu extends Thread {//1. 需要在成员位置创建一个烧烤变量,作为锁对象private ShaoKao bz;//2. 使用带参数构造方法,为这个烧烤变量赋值public ShaoKaoPu(ShaoKao bz) {this.bz = bz;}//设置线程任务(run), 生产烧烤public void run() {//定义一个变量,这个变量决定到底要做什么馅的烧烤int count = 0;//死循环,让烧烤铺一直生产烧烤while(true) {//必须使用同步技术保证两个线程只能有一个在执行synchronized(bz) {//对烧烤的状态进行判断if(bz.flag == true) {//已经有烧烤了,不用生产,烧烤铺调用wait方法进入等待状态try {bz.wait();} catch (InterruptedException e) {e.printStackTrace();}}//被吃货唤醒之后,证明没有烧烤了,又要开始生产烧烤//增加一些趣味性:交替生产烧烤if(count % 2 == 0) {//生产 羊肉烤串bz.chuan = "大串";bz.rou = "羊肉";}else {//生产 牛肉大葱馅bz.chuan = "大串";bz.rou = "羊肉";}count++;System.out.println("烧烤铺正在生产:" + bz.chuan + bz.rou + "烧烤");//生产烧烤需要3秒钟try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}//烧烤铺生产好了烧烤,修改烧烤的状态为true有bz.flag = true;//唤醒吃货线程起来吃烧烤
                bz.notify();//烧烤铺已经生产好了烧烤System.out.println("烧烤铺已经生产好了" + bz.chuan + bz.rou + "烧烤" + "吃货可以开始吃了");}}}
}

消费者

package com.shopping.test;public class ChiHuo extends Thread{//1. 需要在成员位置创建一个烧烤变量,作为锁对象private ShaoKao bz;//2. 使用带参数构造方法,为这个烧烤变量赋值public ChiHuo(ShaoKao bz) {this.bz = bz;}//设置线程任务(run), 吃烧烤public void run() {//死循环,让吃货一直吃烧烤while(true) {//必须使用同步技术保证两个线程只能有一个在执行synchronized(bz) {//对烧烤的状态进行判断if(bz.flag == false) {//发现没有烧烤,吃货调用wait方法进入等待状态,等烧烤铺做好烧烤try {bz.wait();} catch (InterruptedException e) {e.printStackTrace();}}//被烧烤铺唤醒之后,证明有烧烤吃了System.out.println("吃货正在吃:" + bz.chuan + bz.rou + "的烧烤");//吃货吃完烧烤//修改烧烤的状态为false没有bz.flag = false;//吃货唤醒烧烤铺线程,继续生产烧烤
                bz.notify();System.out.println("吃货已经把:" + bz.chuan + bz.rou + "的烧烤吃完了");System.out.println("---------------------------------------------------------------------------");}}}
}

测试:

package com.shopping.test;public class Test {public static void main(String[] args) {//创建烧烤对象,作为锁对象ShaoKao bz = new ShaoKao();//创建烧烤铺线程new ShaoKaoPu(bz).start();//开启吃货线程new ChiHuo(bz).start();}
}

输出的是:

烧烤铺正在生产:大串羊肉烧烤
烧烤铺已经生产好了大串羊肉烧烤吃货可以开始吃了
吃货正在吃:大串羊肉的烧烤
吃货已经把:大串羊肉的烧烤吃完了
---------------------------------------------------------------------------
烧烤铺正在生产:大串羊肉烧烤
烧烤铺已经生产好了大串羊肉烧烤吃货可以开始吃了
吃货正在吃:大串羊肉的烧烤
吃货已经把:大串羊肉的烧烤吃完了
---------------------------------------------------------------------------
烧烤铺正在生产:大串羊肉烧烤
烧烤铺已经生产好了大串羊肉烧烤吃货可以开始吃了
吃货正在吃:大串羊肉的烧烤
吃货已经把:大串羊肉的烧烤吃完了
---------------------------------------------------------------------------

转载于:https://www.cnblogs.com/wyf-love-dch/p/11407347.html

写一个生产者消费者的例子相关推荐

  1. 面试官让我手写一个生产者消费者模式?

    不知道你是否遇到过面试官让你手写生产者消费者代码.别说,前段时间有小伙伴还真的遇到了这种情况,当时是一脸懵逼. 但是,俗话说,从哪里跌倒就要从哪里爬起来.既然这次被问到了,那就回去好好研究一下,争取下 ...

  2. java 消费者 生产者 队列_用Java写一个生产者-消费者队列

    packageyunche.test.producer;importjava.util.LinkedList;importjava.util.Random;/*** @ClassName: Produ ...

  3. 使用LinkedBlockingQueue来实现生产者消费者的例子

    工作中,经常有将文件中的数据导入数据库的表中,或者将数据库表中的记录保存到文件中.为了提高程序的处理速度,可以设置读线程和写线程,这些线程通过消息队列进行数据交互.本例就是使用了LinkedBlock ...

  4. Qt 实现的一个生产者消费者模式类

    最近做公司项目遇到一个问题,加载20万的日志文件,解析后写入数据库中.做完后发现读文件.解析.写入数据依次搞下来,速度实在是太慢. 所以学习用多线程的来完成这个工作,考虑用生产者消费者模式来完成. 单 ...

  5. Linux 生产者消费者简单例子学习

    #if 0Linux实现生产者消费者模型1. 防止虚假唤醒2. 唤醒线程的时机很重要,否则会导致线程多次访问锁,影响性能 #endif#include <unistd.h> #includ ...

  6. 面试官:手写一个必然死锁的例子?一顿操作猛如虎。。

    来源:blog.csdn.net/xiewenfeng520/article/details/107230996 前言 只对死锁代码感兴趣的可以直接跳到第三小节 必然死锁示例,如果对死锁还不太了解的, ...

  7. java kafka 集群消费_kafka集群搭建和使用Java写kafka生产者消费者

    转自:http://chengjianxiaoxue.iteye.com/blog/2190488 1 kafka集群搭建 1.zookeeper集群 搭建在110, 111,112 2.kafka使 ...

  8. Java多线程学习四十:如何写一个必然死锁的例子

    死锁是什么?有什么危害? 什么是死锁 发生在并发中 首先你要知道,死锁一定发生在并发场景中.我们为了保证线程安全,有时会给程序使用各种能保证并发安全的工具,尤其是锁,但是如果在使用过程中处理不得当,就 ...

  9. java单链表例子_写一个java链表的例子?随便举例说一下。

    展开全部 //单链表类 package dataStructure.linearList; import dataStructure.linearList.Node; //导入单链表结点类 impor ...

  10. mysql死锁 简单例子_写一个Mysql死锁的例子

    创建表 CREATE TABLE `test1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(10) NOT NULL, PRIMAR ...

最新文章

  1. Oracle游标的使用
  2. 【正一专栏】希望才是深深让人绝望的东西-论国足
  3. cmd无法输出java结果_cmd中执行java命令没有输出结果
  4. 详解Linux的压缩解压缩命令
  5. bios免电池补丁_补丁和权限 处理器漏洞多大这样看
  6. 散文绘画集《心欢喜,灵快乐》研讨会在京举行
  7. 深度学习之 DCN(Deformable Convolution)-可变形卷积
  8. python编写add函数求和_为什么python不利用__iadd__来实现求和和链接运算符?
  9. GitHub入门详解
  10. mysql的架构及查询sql的执行流程(二)
  11. nRF52840(一) 环境搭建
  12. termios 详解
  13. linux的vi2编辑相关命令,Linux vi/vim编辑器常用命令与用法总结
  14. 用Java实现N*N的标准数独及对角线数独解题
  15. 华盛顿大学计算机专业gpa,以未决定专业进入大学再转计算机专业可行吗?
  16. php 分布式事务 DTM (TCC模式和Saga模式的区别)
  17. Creator 3.0中摄像机调整技巧: 1.旋转:Cmd+右键 移动:空格+右键 放缩:滚轮
  18. python迅雷远程下载页面_迅雷远程下载 linux
  19. mysql全套理解以及在php中的应用
  20. 服务器win10系统怎样共享,win10系统开启局域网共享

热门文章

  1. matlab如何制作莫兰散点图,求大神指点绘制空间内散点图的包络面,,,散点程序如下...
  2. win7信息服务器,Windos2012 中的共享,win8/win10用户访问正常,WIN7用户不能访问
  3. Java保存class文件,[转载]Class文件在JVM中如何存储
  4. python图片x轴数据过多_一个操作证明python数据可视化比excel强百倍:X轴刻度间隔显示...
  5. 六、面向对象编程——类和对象
  6. 后台json返回给ajax,Ajax 如何 得到后台返回 的json数据,正确的格式应该如何去写?...
  7. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_2-5.开源工具的优缺点选择和抽象方法的建议...
  8. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第3节 两种获取Stream流的方式_8_Stream流中的常用方法_skip...
  9. Python 函数参数 传引用还是传值
  10. .net 中文语音朗读