使用管程法

属性定义

  • 缓冲区的容量为10
  • 生产者将生产100个面包
  • 消费者将消费105个面包

思路

  • 生产者不停地生产,生产结果放进缓冲区
    消费者不停地消费,从缓冲区中取走产品

  • 当缓冲区为10时,停止生产,线程阻塞
    当缓冲区为0时,停止消费,线程阻塞

  • 当成功生产一个后,唤醒所有线程
    当成功消费一个后,唤醒所有线程


以下两种方式运行结果相同:

方法一:同步块

package cn.hanquan.test;/** 生产者消费者问题——管程法* 缓冲区的容量为10* 生产者将生产100个面包* 消费者将消费100个面包*/
public class ProducerConsumer {public static void main(String[] args) {Stack s = new Stack();Consumer c = new Consumer(s);Producer p = new Producer(s);c.start();p.start();}
}//面包
class Bread {int num;public Bread(int num) {this.num = num;}public Bread() {}
}//缓冲区
class Stack {Bread[] breads = new Bread[10];int total = 0;public void push(Bread b) {if(total==breads.length) {try {this.wait();//线程阻塞} catch (InterruptedException e) {}}breads[total] = b;try {Thread.sleep(20);//模拟延时} catch (InterruptedException e) {}total++;this.notifyAll();}public Bread pop() {if(total==0) {try {this.wait();//线程阻塞} catch (InterruptedException e) {}}total--;try {Thread.sleep(90);//模拟延时} catch (InterruptedException e) {}this.notifyAll();Bread b = new Bread();b = breads[total];return b;}
}//生产者
class Producer extends Thread {Stack s;public Producer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 105; i++) {synchronized(s) {s.push(new Bread(i));}System.out.println("生产" + i);}}
}//消费者
class Consumer extends Thread {Stack s;public Consumer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 100; i++) {synchronized(s) {System.out.println("消费" + s.pop().num);}}}
}

方法二:同步方法

package cn.hanquan.test;/** 生产者消费者问题——管程法* 缓冲区的容量为10* 生产者将生产100个面包* 消费者将消费100个面包*/
public class ProducerConsumer {public static void main(String[] args) {Stack s = new Stack();Consumer c = new Consumer(s);Producer p = new Producer(s);c.start();p.start();}
}//面包
class Bread {int num;public Bread(int num) {this.num = num;}public Bread() {}
}//缓冲区
class Stack {Bread[] breads = new Bread[10];int total = 0;public synchronized void push(Bread b) {if (total == breads.length) {try {this.wait();// 线程阻塞} catch (InterruptedException e) {}}breads[total] = b;try {Thread.sleep(20);// 模拟延时} catch (InterruptedException e) {}total++;this.notifyAll();}public synchronized Bread pop() {if (total == 0) {try {this.wait();// 线程阻塞} catch (InterruptedException e) {}}total--;try {Thread.sleep(90);// 模拟延时} catch (InterruptedException e) {}this.notifyAll();Bread b = new Bread();b = breads[total];return b;}
}//生产者
class Producer extends Thread {Stack s;public Producer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 105; i++) {s.push(new Bread(i));System.out.println("生产" + i);}}
}//消费者
class Consumer extends Thread {Stack s;public Consumer(Stack s) {this.s = s;}public void run() {for (int i = 0; i < 100; i++) {System.out.println("消费" + s.pop().num);}}
}

运行结果

生产0
消费0
生产1
消费1
生产2
消费2
生产3
消费3
生产4
消费4
生产5
消费5
生产6
消费6
生产7
消费7
生产8
消费8
生产9
消费9
生产10
消费10
生产11
消费11
生产12
消费12
生产13
消费13
生产14
消费14
生产15
消费15
生产16
消费16
生产17
消费17
生产18
消费18
生产19
消费19
生产20
消费20
生产21
消费21
生产22
消费22
生产23
消费23
生产24
消费24
生产25
消费25
生产26
消费26
生产27
消费27
生产28
消费28
生产29
消费29
生产30
消费30
生产31
消费31
生产32
消费32
生产33
消费33
生产34
消费34
生产35
消费35
生产36
消费36
生产37
消费37
生产38
消费38
生产39
消费39
生产40
消费40
生产41
消费41
生产42
消费42
生产43
消费43
生产44
消费44
生产45
消费45
生产46
消费46
生产47
消费47
生产48
消费48
生产49
消费49
生产50
消费50
生产51
消费51
生产52
消费52
生产53
消费53
生产54
消费54
生产55
消费55
生产56
消费56
生产57
消费57
生产58
消费58
生产59
消费59
生产60
消费60
生产61
消费61
生产62
消费62
生产63
消费63
生产64
消费64
生产65
消费65
生产66
消费66
生产67
消费67
生产68
消费68
生产69
消费69
生产70
消费70
生产71
消费71
生产72
消费72
生产73
消费73
生产74
消费74
生产75
消费75
生产76
消费76
生产77
消费77
生产78
消费78
生产79
消费79
生产80
消费80
生产81
消费81
生产82
消费82
生产83
消费83
生产84
消费84
生产85
消费85
生产86
消费86
生产87
消费87
生产88
消费88
生产89
消费89
生产90
消费90
生产91
消费91
生产92
消费92
生产93
消费93
生产94
消费94
生产95
消费95
生产96
消费96
生产97
消费97
生产98
消费98
生产99
消费99
生产100
生产101
生产102
生产103
生产104

【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多线程 生产者-消费者问题示例

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

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

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

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

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

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

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

最新文章

  1. 计算机电缆线对成缆系数,计算机电缆绞合系数 - 无图版
  2. V3S中默认时区设置(笔记)
  3. python3爬虫(6)爬虫代理的使用
  4. 【小程序开发者专享】腾讯云联手多家科技企业,聚焦小程序·云开发实践!...
  5. mysql如何逻辑删除_mysql逻辑删除如何恢复
  6. google的一些秘密入口
  7. iTerm – 让你的命令行也能丰富多彩
  8. 论肱二头肌在日常生活中的锻炼的持久战|健身达人
  9. 不间断电源ups标准_UPS不间断电源除尘技巧分析
  10. 解决虚拟机克隆后eth0不见的问题
  11. Mybatis Mapper动态代理方式 typeAliases 别名的使用
  12. VS2010 在Win 7 附加w3wp.exe进程进行调试
  13. 数据中心智能综合监控系统
  14. qq在线客服html代码,QQ在线客服JS代码,自适应漂浮在网页右侧
  15. 【vuejs】有关UI框架“ydui”中的倒计时组件的使用
  16. tf1.x error:Variable generator/encoder_image/conv2d/kernel already exists, disallowed
  17. 防水测试设备的应用领域
  18. python自动垃圾分类_现在垃圾都得分类,如何利用Python快速实现一个垃圾分类APP?...
  19. 双系统平板刷linux系统下载软件,台电官方论坛 - Windows平板加装Ubuntu实现双系统的尝试,有图有真相 - 平板笔记本...
  20. 【SAP】公司代码与采购组织的分配关系

热门文章

  1. HDU - 5335 Walk Out(bfs+路径输出+贪心)
  2. php mysql int string_mysql查出的 int 型字段都是 string
  3. navicat创建数据库后显示图标灰色,右键后无法新建数据库
  4. AppVerifier的功能和原理
  5. live555 源码分析: DESCRIBE 的处理
  6. 5招减少网站恶意文件上传
  7. 浅谈 FTP、FTPS 与 SFTP
  8. Go命令行库Cobra的使用
  9. Qt下Tcp传输文件
  10. 揭秘视频千倍压缩背后的技术原理之预测技术