目录

生产者消费者模式

汉堡类

容器类

生产者

消费者

测试类

案例:多线程并发卖票


生产者消费者模式

在一个生产环境中,生产者和消费者在同一时间段内共享同一块缓冲区,生产者负责向缓冲区添加数据,消费者负责从缓冲区取出数据。

汉堡类

public class Hamburger {private int id;
​public int getId() {return id;}
​public void setId(int id) {this.id = id;}
​@Overridepublic String toString() {return "Hamburger{" +"id=" + id +'}';}
}

容器类

public class Container {public Hamburger[] array = new Hamburger[6];public int index = 0;/*** 向容器中添加汉堡*/public synchronized void push(Hamburger hamburger){while(index == array.length){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notify();array[index] = hamburger;index++;System.out.println("生产了一个汉堡"+hamburger);}/*** 从容器中取出汉堡*/public synchronized Hamburger pop(){while(index == 0){//当前线程暂停//让正在访问当前资源的线程暂停try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}//唤醒之前暂停的线程this.notify();index--;System.out.println("消费了一个汉堡"+array[index]);return array[index];}
}

生产者

import java.util.concurrent.TimeUnit;
​
/*** 生产者*/
public class Producer {private Container container;public Producer(Container container){this.container = container;}
​public void product(){for (int i = 0; i < 30; i++) {Hamburger hamburger = new Hamburger(i);this.container.push(hamburger);try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}
}

消费者

import java.util.concurrent.TimeUnit;
​
public class Consumer {private Container container;
​public Consumer(Container container) {this.container = container;}
​public void consum(){for (int i = 0; i < 30; i++) {this.container.pop();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}}
}

测试类

public class Test {public static void main(String[] args) {Container container = new Container();Producer producer = new Producer(container);Consumer consumer = new Consumer(container);new Thread(()->{producer.product();}).start();new Thread(()->{producer.product();}).start();new Thread(()->{consumer.consum();}).start();new Thread(()->{consumer.consum();}).start();new Thread(()->{consumer.consum();}).start();}
}

案例:多线程并发卖票

一场球赛的球票分 3 个窗口出售,共 15 张票,用多线程并发来模拟 3 个窗口的售票情况

import java.util.concurrent.TimeUnit;
​
public class Ticket {//剩余球票private int surpluCount = 15;//已售出球票private int outCount = 0;
​public synchronized void sale(){while(surpluCount > 0){try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}if(surpluCount == 0){return;}surpluCount--;outCount++;if(surpluCount == 0){System.out.println(Thread.currentThread().getName()+"售出第"+outCount+"张票,球票已售罄");}else{System.out.println(Thread.currentThread().getName()+"售出第"+outCount+"张票,剩余"+surpluCount+"张票");}}}
}
public class Test {public static void main(String[] args) {Ticket ticket = new Ticket();new Thread(()->{ticket.sale();},"A").start();
​new Thread(()->{ticket.sale();},"B").start();
​new Thread(()->{ticket.sale();},"C").start();}
}

Java(二十二) -- 生产者消费者模式相关推荐

  1. java 生产者消费者模式_聊聊并发(十)生产者消费者模式

    本文首发于InfoQ   作者:方腾飞  校对:张龙 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使 ...

  2. Java并发编程实战~生产者-消费者模式

    前面我们在<Worker Thread 模式>中讲到,Worker Thread 模式类比的是工厂里车间工人的工作模式.但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就 ...

  3. Java多线程(含生产者消费者模式详解)

    多线程 导航 多线程 1 线程.进程.多线程概述 2 创建线程 (重点) 2.1 继承Thread类(Thread类也实现了Runnable接口) 2.2 实现Runnable接口(无消息返回) 2. ...

  4. Java多线程:解决生产者/消费者模式

    什么是生产者/消费者模式 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品. 具体来说就是: 生产者 ...

  5. 生产者消费者_【Java面试】实现生产者消费者模式

    使用 BlockingQueue 实现生产者消费者模式 public class ProducerConsumerModel2 { private static BlockingQueue queue ...

  6. 【趣说JAVA】什么是生产者消费者模式?用恶趣味的方式来解释

    故事背景: 从前有一个产奥力给怪物叫扎克,因为自己喜欢产奥力给,所以没人喜欢它,它很自卑,直到有天遇到了一个叫老八的吞翔人,两人惺惺相惜,上演了一出生产者和消费者模式的gay情故事.扎克拉完到厕所,厕 ...

  7. java线程池实现生产者消费者模式

    本人并发小白,如果有可以优化的地方欢迎评论交流- 题目如下: ​  15个生产者生产1000条数据(从1开始,每生产一条加1),并向消息队列中存放字符串("第m个生产者生产数据n" ...

  8. 设计模式之生产者消费者模式

    简介 通过前几篇文章的学习,我想你已经彻底掌握了wait()方法和notify()方法如何使用以及在哪种情况下使用了,本片文章我们将讲解下设计模式中的生产者消费者模式,我将通过手写一份生产者消费者模式 ...

  9. 聊聊并发 生产者消费者模式

    http://ifeve.com/producers-and-consumers-mode/ 本文首发于InfoQ   作者:方腾飞  校对:张龙 在并发编程中使用生产者和消费者模式能够解决绝大多数并 ...

  10. 生产者消费者模式剖析

    转载自并发编程网 – ifeve.com本文链接地址: 聊聊并发(十)生产者消费者模式 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序 ...

最新文章

  1. wamp如何更改网站根目录DocumentRoot
  2. 终极版Python学习教程:一篇文章讲清楚Python虚拟环境
  3. 常见b2c网站购物车的设计
  4. vc 文本框 只显示下划线_Word手动添加下划线就out了?虚线、波浪线、双下划线一键搞定...
  5. 剑指 Offer 09. 用两个栈实现队列(相邻相同操作只需要移动一次)
  6. 【SpringBoot 2】(三)SpringBoot相较于Spring的特点
  7. rails rake和示例
  8. ubuntu linux 12.04 下载,Ubuntu12.04下载,Ubuntu12.04更新源下载(多种下载方式)
  9. 小米路由的IPv6支持教程(纯转保存)
  10. csrf 与 samesite
  11. win10安装免安装版的mysql5.7
  12. CentOS 7 安装 Weadmin(ITOSS)
  13. Python 3 执行 MIUI 线刷包内 flash_gen_crc_list.py 文件
  14. 计算机图形学透视投影知识点,计算机图形学
  15. 2021-05-12 MongoDB面试题 什么是MongoDB分片集群
  16. 函数极限:函数在一点处的极限
  17. react 谷歌地图_谷歌地图与React
  18. 一键分享到微博、QQ、微信、QQ空间、豆瓣、人人网、开心网、百度贴吧~
  19. Threading lightly, Part 2: Reducing contention
  20. 计算机二级小蒋是一位中学老师,解析:小蒋是一位中学教师,在教务处负责初一年级学生的成绩管理。由于学校地处偏远地区,缺乏必要的教学 - 计算机二级 - 看书网站...

热门文章

  1. C语言-数组-读入学生信息统计各分数段人数并打印
  2. 实时数仓实践(一)之数据库实时增量同步工具-CDC(Change Data Capture)
  3. 【pytest】(六) pytest中fixture的使用
  4. educoder 数据库原理与应用 实验六 约束与索引
  5. 吐血分享:QQ群霸屏技术教程(接单篇)
  6. 节卡JAKA机械臂培训笔记(偏入门)
  7. vos3000外呼系统讯时O口网关加密注册 VOS 配置方法
  8. Android 9 Pie
  9. 网速由100M变成10M的原因与解决方法
  10. oracle异地双活距离,再谈异地双活容灾部署(6.24)