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 }

转载于:https://www.cnblogs.com/tianming18/p/10245061.html

Java中的生产消费者问题相关推荐

  1. Java中生产者和消费者总结

    生产者和消费者问题是线程模型中的经典问题,生产者和消费者在同一时间段共用同一个存储空间,这个存储空间是一个缓冲区的仓库,生产者可以将产品放入仓库,消费者可以从仓库中取出产品. 生产者/消费者模型是基于 ...

  2. Java中生产者与消费者问题的演变

    想要了解更多关于Java生产者消费者问题的演变吗?那就看看这篇文章吧,我们分别用旧方法和新方法来处理这个问题. 生产者消费者问题是一个典型的多进程同步问题. 对于大多数人来说,这个问题可能是我们在学校 ...

  3. java中的生产者消费者模式详解

    方式 一: Synchronized方式 注:此种方式会造成资源的浪费: 利用锁的notifyAll()方法会将所有的线程都唤醒,会造成资源的浪费 class Resource {private St ...

  4. Java中notify和notifyAll的区别 - 何时以及如何使用

    Java  notify   vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...

  5. java中synchronized同步锁实现生产者消费者模式

    synchronized介绍 一.基本概念 synchronized关键字是java里面用来在多线程环境下保证线程安全的同步锁:java里面有对象锁和类锁,对象锁是用在对象实例的方法上或者一个对象实例 ...

  6. 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. wait, notify 和 noti ...

  7. java中什么时候应用异常_生产Java应用程序中的十大异常类型-基于1B事件

    java中什么时候应用异常 Pareto记录原理:97%的记录错误语句是由3%的唯一错误引起的 在最新的数据整理帖子之后,我们收到了很多反馈和问题,我们发现97%的记录错误是由10个唯一错误引起的 . ...

  8. java生成者消费者模式,java生产消费者模式

    package productiveConsumption2; /* * 面包类 */ public class Bread { private int id; private String name ...

  9. Java中的多线程你只要看这一篇就够了

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

最新文章

  1. 今年期末微积分考试试题:看看你能够在两个小时内做对几道题?
  2. C# 连接数据库 Sql Server
  3. c++用一级运算比较大小_阿里百度腾讯 C/C++ 面试题总结,我全都告诉你!
  4. 2020 我的C++的学习之路 第八章函数
  5. RHCE认证培训+考试七天实录(一)
  6. c#解析json字符串处理清晰易懂的方法
  7. Smarty目录结构和子目录路径问题
  8. 演练 base调用父类的方法 c# 1613713591
  9. ffdshow 源代码分析 9: 编解码器有关类的总结
  10. libxml主要函数说明 (二)
  11. Java实现文件复制功能
  12. openg-光照贴图
  13. 【稳定性day2】当当网的高可用之道
  14. 怎样做自媒体视频剪辑赚钱?
  15. JS判断手机浏览器,并跳转到手机端网页
  16. 全球及中国雾化铜和铜合金粉末行业产销需求及发展动态分析报告2022-2028年
  17. linux http status404,解决问题:HTTP Status 404(The requested resource is not avail
  18. ”高内聚 ,低耦合“到底是什么意思?
  19. CNN与句子分类之动态池化方法DCNN--模型介绍篇
  20. c语言中指数形式怎么表示_C语言编程基础知识汇总学习,适合初学者!

热门文章

  1. BIEE叙述图导航实例
  2. 微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章...
  3. TurboMail邮件服务器腾云驾务云化邮件办公
  4. smartforms长文本处理方式
  5. 升级dedecms5.5后,出现提示保存目录数据时失败,请检查你的输入资料是否存在问题...
  6. 2020-01-14 转载【dpdk】使用libpcap-PMD驱动收发包
  7. avl树 php,PHP实现平衡二叉树(AVL树)
  8. spring4+struts2+hibernate5整合出现spring异常
  9. Openlayers4加载天地图
  10. SpringCloud系列之Nacos+Dubbo+Seata应用篇