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. Java 容器源码分析之 Set

    Set 表示由无重复对象组成的集合,也是集合框架中重要的一种集合类型,直接扩展自 Collection 接口.在一个 Set 中,不能有两个引用指向同一个对象,或两个指向 null 的引用.如果对象 ...

  2. php使用cURL上传图片

    上传文件和POST非常相似,都是通过表单采取POST方法提交的. 先新建一个接收文件的页面upload.php: var_dump($_POST); var_dump($_FILES); 再建立一个发 ...

  3. MySQL中间件之ProxySQL(9):ProxySQL的查询缓存功能

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的 ...

  4. Perl文件测试操作和stat函数

    在shell中通过test命令或者中括号[]可以进行文件测试以及其它类型的测试,例如判断文件是否存在,比较操作是否为真等等.perl作为更强大的文本处理语言,它也有文件测试类表达式,而且和shell的 ...

  5. CentOS 7.6安装桌面

    # yum -y groups install "GNOME Desktop" # startx

  6. axios 用法简介(转载)

    axios 来源:https://www.jianshu.com/p/df464b26ae58   一.安装 1. 利用npm安装npm install axios --save2. 利用bower安 ...

  7. PATH环境变量

    PATH是环境变量,要大写 那几个目录是你放置linux命令的目录,输入命令后系统会去PATH中寻找是否存在该命令 查看当前环境变量: echo $PATH 也可以用set命令看一下 设置: expo ...

  8. 使用laravel框架开发接口时ajax post请求报错419

    nginx服务器,使用laravel框架开发后台接口.get请求正常,但是post请求一直报错.H5和APP都不成功,code=419. 解决办法: 找到 VerifyCsrfToken.php文件( ...

  9. es6 语法 (解构赋值)

    1.结构赋值 { let a,b,c; [a,b] = [1,2]; console.log(a,b); //1,2} { let a,b,rest; [a,b,...rest] = [1,2,3,4 ...

  10. sublime text2 中标签高亮效果BracketHighlighter插件

    1.打开package Control,选择install Package 2.输入BracketHighlighter,回车 3.这样该插件会自动安装,安装后所有的提示高亮都是白色或没有提示.按 p ...