1. package day190109;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.Queue;
  5. import java.util.Random;
  6.  
  7. public class 生产消费者ThreadDemo10 {
  8. public static void main(String[] args) {
  9. //生产消费者模式
  10. Queue<Phone> queue = new LinkedList<Phone>();
  11. Producer producer = new Producer(queue,30);
  12. Consumers consumers = new Consumers(queue,"李江萍");
  13. Consumers consumers1 = new Consumers(queue,"熊天明");
  14.  
  15. producer.start();
  16. consumers.start();
  17. consumers1.start();
  18.  
  19. }
  20. }
  21. class Producer extends Thread{
  22. public Queue<Phone> queue;
  23. public int max;
  24. //构造方法
  25. public Producer(Queue<Phone> queue, int max) {
  26. this.queue = queue;
  27. this.max = max;
  28. }
  29.  
  30. @Override
  31. public void run() {
  32. while (true){
  33. synchronized (queue) {
  34. try {
  35. Thread.sleep(1000);
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. if (queue.size() == max) { //如果生产的商品满啦
  40. try {
  41. System.out.println("你好!本地库存产品已满!请通知消费之前来消费");
  42. queue.wait();//先不忙生产,让消费者先消费
  43. } catch (InterruptedException e) {
  44. e.printStackTrace();
  45. }
  46. } else {
  47. Random r = new Random();
  48. Phone p = new Phone(r.nextInt(7), (double) r.nextInt(2000));
  49. System.out.println("甲方已经生产了1个手机:" + p);
  50. queue.offer(p);
  51. System.out.println(" 生产后现在的库存是:" + queue.size()+"个");
  52. queue.notifyAll();//通知消费者。可以消费啦
  53. }
  54. }
  55. }
  56. }
  57. }
  58. class Consumers extends Thread{
  59. public Queue<Phone> queue;
  60. public String name;
  61. //构造方法
  62. public Consumers(Queue<Phone> queue, String name) {
  63. this.queue = queue;
  64. this.name = name;
  65. }
  66.  
  67. @Override
  68. public void run() {
  69. while (true) {
  70. synchronized (queue) {
  71. try {
  72. Thread.sleep(1000);
  73. } catch (InterruptedException e) {
  74. e.printStackTrace();
  75. }
  76. if (queue.size() == 0) {
  77. try {
  78. System.out.println(this.name+"说:“你们本地库存产品严重不足”");
  79. queue.wait();
  80. } catch (InterruptedException e) {
  81. e.printStackTrace();
  82. }
  83. } else {
  84. Phone p = queue.poll();
  85. System.out.println(this.name + "说:我要买1个手机:" + p);
  86. System.out.println(" 消费后现在的库存是:" + queue.size()+"个");
  87. queue.notifyAll();//通知生产者可以生产了
  88. }
  89. }
  90. }
  91. }
  92. }
  93. class Phone{
  94. private Integer size;
  95. private Double price;
  96.  
  97. public Phone(Integer size, Double price) {
  98. this.size = size;
  99. this.price = price;
  100.  
  101. }
  102.  
  103. @Override
  104. public String toString() {
  105. return "手机规格是{" +
  106. "尺寸是:" + size +
  107. ", 价格是:" + price +"元"+
  108. '}';
  109. }
  110. }

Java中的生产消费者问题的更多相关文章

  1. Java中生产者与消费者模式

    生产者消费者模式 首先来了解什么是生产者消费者模式.该模式也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了两个共享固定大小缓冲区的线 ...

  2. Python - Asyncio模块实现的生产消费者模型

    [原创]转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时, ...

  3. Java多线程系列--“基础篇”11之 生产消费者问题

    概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...

  4. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

  5. java中使用阻塞队列实现生产这与消费这之间的关系

    需求如下: 有一个生产者和一个消费者,生产者不断的生产产品,消费这不断的消费产品.产品总数为N. 1.生产顺序按队列的方式,先进先出. 2.生产者和消费这可以同时进行. 3.当生产者生产了N个产品后不 ...

  6. Java中的生产者、消费者问题

    Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库) ...

  7. Java 中 wait, notify 和 notifyAll的正确使用 – 以生产者消费者模型为例

    如何使用Wait 尽管关于wait和notify的概念很基础,它们也都是Object类的函数,但用它们来写代码却并不简单.如果你在面试中让应聘者来手写代码,用wait和notify解决生产者消费者问题 ...

  8. java 多线程系列基础篇(十一)之生产消费者问题

    1. 生产/消费者模型 生产/消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”.“消费者”.“仓库”和“产品”.他们之间的关系如下:(01) 生产者仅仅在仓储未满时候生产,仓满则停止生产 ...

  9. Java生产消费者模型——代码解析

    我们将生产者.消费者.库存.和调用线程的主函数分别写进四个类中,通过抢夺非线程安全的数据集合来直观的表达在进行生产消费者模型的过程中可能出现的问题与解决办法. 我们假设有一个生产者,两个消费者来共同抢 ...

随机推荐

  1. python练习三—解析xml

    使用python解析xml,主要使用sax的ContentHandler中的标签开始和标签结束的方法驱动,然后在开始(或者结束)事件中决定使用什么处理方法,使用dispatcher来决定并分发到指定方 ...

  2. PCA实现教程

    数据是机器学习模型的生命燃料.对于特定的问题,总有很多机器学习技术可供选择,但如果没有很多好的数据,问题将不能很好的解决.数据通常是大部分机器学习应用程序中性能提升背后的驱动因素. 有时,数据可能很复 ...

  3. scala程序开发入门

    scala程序开发入门,快速步入scala的门槛: 1.Scala的特性: A.纯粹面向对象(没有基本类型,只有对象类型).Scala的安装与JDK相同,只需要解压之后配置环境变量即可:B.Scala ...

  4. eShopOnContainers 看微服务 ①:总体概览

    一.简介 eShopOnContainers是一个简化版的基于.NET Core和Docker等技术开发的面向微服务架构的参考应用. 该参考应用是一个简化版的在线商城/电子商务微服务参考示例应用. 其 ...

  5. 一个smtp发送错误

    错误返回: Error: need EHLO and AUTH first ! 原因:服务器是smtp.exmail.qq.com,邮箱账号是企业新申请的邮箱账号,邮箱密码需要重新修改. 解决办法:修 ...

  6. C# 从Excel中读取条码

    条形码的应用三------从Excel文件中读取条形码 介绍 上一篇文章,我向大家展示了生成多个条形码并存储到Excel文件中的一个方法.后来我又有了个想法:既然条码插入到excel中了,我可不可以从 ...

  7. mybatis笔记01

    目录 1. Mybatis的介绍 2. 使用JDBC编码的分析 2.1 准备 2.3 程序代码 2.4 JDBC问题 3. Mybatis架构 4. Mybatis入门程序 4.1 mybatis下载 ...

  8. dubbo+zookeeper+springBoot框架整合与dubbo泛型调用演示

    dubbo + zookeeper + spring Boot框架整合与dubbo泛型调用演示   By:客 授客 QQ:1033553122  欢迎加入全国软件测试交流 QQ  群:7156436 ...

  9. 有哪些Java性能优化方法?

    面试官:"有性能优化经验没?"  应聘者:"有一点."   面试官:"那你们从哪些方面做了优化?"   应聘者:"sql优化.JV ...

  10. 详解Java中对象的软、弱和虚引用的区别

    对于大部分的对象而言,程序里会有一个引用变量来引用该对象,这是最常见的引用方法.除此之外,java.lang.ref包下还提供了3个类:SoftReference.WeakReference和Phan ...