奶箱:相当于缓冲区,容量有限,生产者放入牛奶,消费者拿走牛奶
生产者:实现 Runnable 接口,箱子内有牛奶就取出,没有就等着
消费者:实现 Runnable 接口,箱子还有剩余空间就往里放牛奶,箱子满了就等着

奶箱类

public class Box {private int count = 0; //当前奶箱内奶瓶数量private int max = 5; //奶箱大小public synchronized void put(int milk) { //想放milk瓶牛奶System.out.println("想放" + milk);if (count == max) { //奶箱已满,放不了,等人取try {wait();} catch (InterruptedException e) {e.printStackTrace();}}if (count + milk > max) {   //箱内数量+想放数量 > 箱子容量,能放几瓶就放几瓶System.out.println("放入" + (max - count));count = max;} else {    //想放数量 > 剩余容量this.count += milk;System.out.println("放入" + milk);}System.out.println("还剩余" + count);notifyAll();}public synchronized void get(int milk) { //想取milk瓶牛奶System.out.println("想取" + milk);if (count == 0) {   //箱子内无牛奶,只能等try {wait();} catch (InterruptedException e) {e.printStackTrace();}}if (milk > count) { //想取的数量 > 箱子内数量,能拿几瓶拿几瓶count = 0;System.out.println("取出" + count);} else {    //箱子内数量 > 想取的数量count -= milk;System.out.println("取出" + milk);}System.out.println("还剩余" + count);notifyAll();}
}

生产者(送奶工)

public class Producer implements Runnable { //送奶工private Box b = null;public Producer(Box b) {this.b = b;}@Overridepublic void run() {while (true) {//随机生成想放的数量Random random = new Random();b.put(random.nextInt(5) + 1);//休息一下try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

消费者

public class Costomer implements Runnable { //消费者private Box b = null;public Costomer(Box b) {this.b = b;}@Overridepublic void run() {while (true) {//随机生成想取的梳理Random random = new Random();b.get(random.nextInt(5) + 1);//休息一下try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

测试类

public class BoxTest {public static void main(String[] args) {Box b = new Box();Producer p = new Producer(b);Costomer c = new Costomer(b);Thread t1 = new Thread(p);Thread t2 = new Thread(c);t1.start();t2.start();}
}

Java多线程 生产者-消费者问题示例相关推荐

  1. Java多线程-生产者消费者问题(多个消费者多个生产者)

    Java多线程-生产者消费者问题(多个消费者多个生产者) public class ConsumerProcuderDemo {public static void main(String[] arg ...

  2. java多线程 生产者消费者_java多线程之-生产者与消费者

    java多线程之-并发协作[生产者与消费者]模型 对于多线程程序来说,不管c/c++ java python 等任何编程语言,生产者与消费者模型都是最为经典的.也就是可以说多线程的并发协作 对于此模型 ...

  3. Java多线程生产者消费者调度实现

    生产者消费者模型是多线程中最常见的模型,有着广泛的应用.其主要目的是实现一种动态的平衡,让生产者消费者和谐共处,获得最大化的执行效率. 所说的动态平衡其实就是生产者与消费者协作控制仓储,让消费者不至于 ...

  4. Java多线程——生产者消费者问题

    创建多个线程去执行不同的任务,如果这些任务之间有着某种关系,那么线程之间必须能够通信来协调完成工作. 生产者消费者问题(英语:Producer-consumer problem)就是典型的多线程同步案 ...

  5. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例

    /**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者.消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里 ...

  6. java多线程-生产者消费者模式

    进程定义: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位 线程定义: 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能 ...

  7. Java多线程-生产者与消费者

    Java多线程生产者与消费者,准确说应该是"生产者-消费者-仓储"模型,使用了仓储,使得生产者消费者模型就显得更有说服力. 对于此模型,应该明确一下几点: 1.生产者仅仅在仓储未满 ...

  8. 【Java】生产者消费者模型

    [Java]生产者消费者模型 0x1 前言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间 ...

  9. 多线程生产者消费者模型

    1. 基础知识: 1. 什么是生产者-消费者模式: 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的 ...

最新文章

  1. 谷歌新研究对神经网络数据并行性提出质疑
  2. 02python 中的线程
  3. Swiper(Swiper master)是目前应用较广泛的移动端网页触摸内容滑动js插件
  4. jq匹配偶数行_jquery怎么实现奇偶行不同背景颜色?
  5. python3.5 安装PyCrypto
  6. Vue Devtools 安装
  7. Tesla 两年前车祸致死案,事故报告终发布
  8. WPF TextBox/TextBlock 文本超出显示时,文本靠右显示
  9. scp 跨机远程拷贝
  10. SQLLDR载数加速,优化参数
  11. Nacos集群(一)节点启动初始化源码解析
  12. BAT54C不断电源保护电路
  13. ZZULIOJ 1047: 对数表(Java)
  14. 有道词典使用离线翻译
  15. 中央预算单位银行账户管理系统单机版2021--运行环境配置指南
  16. 语言本地化的救急解决方案 (非Unicode编码的程序)
  17. 生信识图之 点图进阶-3(MA)
  18. 阿里云centos7部署l2tp后无法连接
  19. 期货投资者教育系列丛书 铝
  20. 云呐数据备份|什么是结构化数据

热门文章

  1. 怎么用Java解二元方程_正则表达式解二元方程式代码
  2. linux sqlite图形工具,SQLite 图形化管理工具
  3. 联想电脑G40无法使用 非要睡眠后才能启用wifi
  4. 设置密保问题,问题不重复设置
  5. 电脑上如何进行屏幕录像?--QVE屏幕录像
  6. 企立方:拼多多快速运营法则
  7. 联想笔记本linux不能启动无线网卡解决方法
  8. 【python爬虫 系列】1.理解网络爬虫
  9. elementUI之表格排序失效,表格宽度可拖拽变宽变窄
  10. 15.真实感图形——光照与明暗+光线跟踪+纹理映射+辐射度方法+阴影