管程法

  • 生产者:负责生产的数据模块
  • 消费者:负责处理数据的模块
  • 缓冲区:消费者不能直接从生产者获取产品,生产者生产进入缓冲区

public class Demo {public static void main(String[] args) {container c = new container();//生产者和消费者有一个共同点容器new Thread(new producer(c)).start();new Thread(new consumer(c)).start();}
}/*** 生产者*/
class producer implements Runnable{container c ;public producer(container c) {this.c = c;}@Overridepublic void run() {for(int i = 0;i < 100;i++){c.product(new goods(i));System.out.println(Thread.currentThread().getName() + "生产了第" + i + "件商品");}}
}/*** 消费者*/
class consumer implements Runnable{container c ;public consumer(container c) {this.c = c;}@Overridepublic void run() {for(int i = 0;i < 100;i++){System.out.println( Thread.currentThread().getName() + "消费了第" + c.consume().num + "件商品");}}
}/*** 商品*/
class goods{int num;public goods(int num) {this.num = num;}}/*** 缓冲区*/
class container{//能够储存商品的数量goods[] buff = new goods[100];//计数器int count = 0;/*** 生产的同步方法*/public synchronized void product(goods good){//生产者生产满了了就通知消费者消费if(count == buff.length){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//生产者生产buff[count++] = good;notifyAll();}/*** 消费的同步方法*/public synchronized goods consume(){if(count == 0){//消费者等待,通知生产者生产try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//消费count--;notifyAll();return buff[count];}}

信号灯法

生产者消费者公用一个资源,两者之间相互依赖

  • 生产者,没有生产产品之前,要通知消费者等待,生产了产品之后要通知消费者消费
  • 消费者,消费之后要通知生产者已结束消费,需要生产产品
  • 设置标志来显示信号
public class signal {public static void main(String[] args) {goods g = new goods("哇哈哈矿泉水");new Thread(new producer(g)).start();new Thread(new consumer(g)).start();}
}
class producer implements Runnable {goods g ;public producer(goods g) {this.g = g;}@Overridepublic void run() {while (true)g.product();}
}
class consumer implements Runnable{goods g;public consumer(goods g) {this.g = g;}@Overridepublic void run() {while (true)g.consume();}
}
class goods{String name;public goods(String name) {this.name = name;}boolean flag = true;public synchronized void product(){if(!flag){//通知消费者消费,生产者等待try {wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "生产了" + name);flag = !flag;notifyAll();}public synchronized void consume(){if(flag){//消费者等待,生产者生产try {wait();} catch (InterruptedException e) {e.printStackTrace();}}flag = !flag;System.out.println(Thread.currentThread().getName() + "消费了" + name);notifyAll();}
}

生产者消费者模型实现方式:管程法,信号灯法相关推荐

  1. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  2. 【操作系统】实现生产者消费者模型

    最近在复习操作系统,随手写两种Java实现生产者消费者模型的方式 一.信号量 import java.util.Queue; import java.util.Random; import java. ...

  3. 互斥锁、共享内存方式以及生产者消费者模型

    守护进程 1.守护进程的概念 进程指的是一个正在运行的程序,守护进程也是一个普通进程 意思就是一个进程可以守护另一个进程 import time from multiprocessing import ...

  4. 生产者-消费者模型的两种实现方式

    https://www.cnblogs.com/caolicangzhu/p/7086176.html 本文主要来总结生产者-消费者模型的代码实现,至于其原理,请大家自行百度. 一.基于链表的生产-消 ...

  5. 【1】生产者-消费者模型的三种实现方式

    (手写生产者消费者模型,写BlockingQueue较简便 ) 1.背景                                                                 ...

  6. 生产者消费者模型-管程法(Java)

    生产者消费者模型-管程法(Java) package src.thread;//生产者 消费者 产品 缓冲区 public class TestPC {public static void main( ...

  7. 三种方式实现生产者-消费者模型

    前言 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例.该问题描述了 ...

  8. 生产者消费者模型的三种实现方式

    某个线程或模块的代码负责生产数据(工厂),而生产出来的数据却不得不交给另一模块(消费者)来对其进行处理,在这之间使用了队列.栈等类似超市的东西来存储数据(超市),这就抽象除了我们的生产者/消费者模型. ...

  9. 进程 互斥锁、队列与管道、生产者消费者模型

    目录 1.互斥锁 2.队列与管道 3.生产者消费者模型(Queue) 4.生产者消费者模型(JoinableQueue) 1.互斥锁 首先导入Lock模块 实例化一把锁 但是每次生成子进程的时候都会重 ...

最新文章

  1. 【毕业求职季】-听说你想去大厂看学姐,带你看看网易java面经
  2. React开发(185):ant design table控制居中和宽度
  3. 深入解读 MySQL 底层原理,让性能“飞起来”的方法总结
  4. 原生ajax的post方法,原生js实现ajax及get post方法
  5. [转]WebGL中文教程
  6. 计算机程序设计在线课程,最新章节测试答案2020学堂在线计算机程序设计基础(先修课)...
  7. windows内核开发笔记九:内核开发分页内存与非分页内存
  8. 70 行 Python 代码写春联,支持行书隶书楷书!
  9. 计算机蓝屏代码0x0000007b,电脑蓝屏代码0x0000007b 电脑蓝屏0x0000007b怎么解决 - 云骑士一键重装系统...
  10. 从零开始写一个武侠冒险游戏-1-状态原型
  11. 电脑进入pe时蓝屏_进入PE系统也会蓝屏?运行PE系统蓝屏原因及解决方法
  12. 人脸识别接口_智慧小区人脸识别门禁系统室外人脸识别门禁终端厂家
  13. 【开源访谈】ECharts 作者 林峰 访谈实录
  14. 如何在PC上运行Android系统?
  15. 再见2019,你好2020,属(鼠)于我的年华
  16. iptables防火墙之SNAT、DNAT策略及应用
  17. PostgreSQL多维空间对象——cube插件
  18. mobaxterm ssh密匙 登录被拒绝:server refused our key
  19. 中兴MKT技术岗位介绍
  20. 太极链——六大技术特点

热门文章

  1. Quality-Estimation0 (翻译质量评价-使用 BERT 特征训练 QE 模型)
  2. app测试移动应用测试 (功能测试)适合0基础学习
  3. python爬楼梯问题_用Python解决经典的爬楼梯问题
  4. 咸鱼Maya笔记—Maya 循环边
  5. 机器视觉入门资料大全,工业机器人“眼睛”
  6. 分布式tensorflow
  7. java video src请求视频流,视频不能拖拽快进问题解决方案
  8. 我国第一部纯国产超级计算机,纯国产超级计算机获得世界冠军
  9. 中国移动5G智慧港口独立专网
  10. 使用DHT11和51单片机进行温湿度的读取(保证好用版本)