多线程经典问题:生产者-消费者

多线程13/经典例题:生产者/消费者问题⭐ 经典例题:生产者/消费者问题 ●生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。 ●这里可能出现两个问题: 1. 生产者比消费者快时,消费者会漏掉一些数据没有取到。 2. 消费者比生产者快时,消费者会取相同的数据。 分析: 3. 阅读详情

生产者-消费者模型

最新接触多线程内容,解决了困惑我许久的 线程锁 以及 线程通信 问题,在此以经典的 生产者-消费者 为典例在此记录。

问题描述

生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。

问题分析

  1. 线程数?生产者线程,消费者线程
  2. 共享数据?店员(或产品数量)
  3. 如何解决线程的安全问题?同步机制,有三种方法
  4. 是否涉及线程的通信?是

代码实现

共享数据-店员(产品数量)

/**
 * 店员:共享资源-产品件数
 */
class Clerk {

    private int num = 0;

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

线程-生产者

/**
 * 生产者
 */
class Producer implements Runnable {
    private final Clerk clerk;

    public Producer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        while (true) {

            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            produceProduct();
        }
    }

    /**
     * 生产商品
     */
    private void produceProduct() {
        synchronized (clerk) {
            if (clerk.getNum() < 20) {
                clerk.setNum(clerk.getNum() + 1);
                System.out.println(Thread.currentThread().getName() + "开始生产了" + clerk.getNum() + "件商品");
                clerk.notifyAll();
            } else {//超过数量,停止生产
                try {
                    clerk.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

线程-消费者

/**
 * 消费者
 */
class Consumer implements Runnable {
    private Clerk clerk;

    public Consumer(Clerk clerk) {
        this.clerk = clerk;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            consumeProduct();
        }
    }

    /**
     * 消费商品
     */
    private void consumeProduct() {
        synchronized (clerk) {
            if (clerk.getNum() > 0) {
                System.out.println(Thread.currentThread().getName() + "消费了第" + clerk.getNum() + "件商品");
                clerk.setNum(clerk.getNum() - 1);
                clerk.notify();
            } else {//商品不足,停止消费
                try {
                    clerk.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

代码测试

/**
 * 线程通信:生产者-消费者
 * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,
 * 店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员
 * 会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品
 * 了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。
 *
 * @author yanjq
 */
public class ProducerConsumerTest {
    public static void main(String[] args) {
        //店员对象,并充当锁
        Clerk clerk = new Clerk();

        Producer producer = new Producer(clerk);
        Consumer consumer1 = new Consumer(clerk);
        Consumer consumer2 = new Consumer(clerk);

        Thread producerThread = new Thread(producer);
        Thread consumerThread1 = new Thread(consumer1);
        Thread consumerThread2 = new Thread(consumer2);

        producerThread.setName("生产者①");
        consumerThread1.setName("消费者①");
        consumerThread2.setName("消费者②");


        producerThread.start();
        consumerThread1.start();
        consumerThread2.start();
    }
}
Java多线程08—经典例题:生产者消费者问题 关于多线程的经典例题:生产者消费者问题 阅读详情

相关推荐

java多线程实现生产者消费者问题

用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题

多线程题目:生产者/消费者问题

题目:   生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。

qq_44923467的博客 323

深入解析MTK DRM初始化流程:从KMS模块到组件框架

本文深入解析了联发科(MTK)平台上DRM显示框架的初始化流程。从内核模块加载、Component框架管理依赖,到核心的mtk_drm_bind函数构建KMS对象(CRTC、Plane、Encoder、Connector),最终完成DRM设备注册并创建用户空间接口。文章结合调试经验,为开发者梳理了从驱动启动到屏幕点亮的完整路径与关键排查点。

onion的博客 767

【java学习—十五】经典例题:生产者/消费者问题(7)

生产者 (Productor) 将产品交给店员 (Clerk) ,而消费者 (Customer)从店员处取走产品,店员一次只能持有固定数量的产品 ( 比如 4 ),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。生产者比消费者快时,消费者会漏掉一些数据没有取到。消费者比生产者快时,消费者会取相同的数据。

weixin_44883789的博客 262

CentOS 7下glibc升级到2.28的保姆级避坑指南(含GCC 7.3.1编译配置)

本文详细介绍了在CentOS 7系统中将glibc升级到2.28版本的完整流程,包括GCC 7.3.1的编译配置、环境变量设置、glibc编译的细节处理以及生产环境验证。文章特别强调了风险控制和避坑技巧,适用于需要提升系统兼容性的企业级用户。

weixin_29611239的博客 408

如何产生ATPG IR-drop分析波形文件(DFT)

摘要:本文介绍了生成VCD波形的流程与要求,主要用于后端进行IR-drop分析。生成过程分为ATPG shift和speed ATPG capture两部分,分别对应不同的输入要求、模式设置和仿真参数。

murphyrong的博客 872

线程通信经典例题:生产者/消费者问题

线程通信经典例题:生产者/消费者问题

weixin_44530708的博客 521

不会ps,你也可以成为ps高手,最强傻瓜式人像一键磨皮美白瘦脸美妆PS插件

比如:美肤是用来去斑点的,如果效果不太理想,就加大百分比,反之就减小。瘦脸如果脸胖的就打开,正常的就关闭。所谓的一键调节,要不只能调节一种效果,要不就是个预设,然后让你自己再调。同时,该软件还加入了贴心的批量处理功能,能同时处理上千张照片,让您喝着茶也能将工作做完。、自动检测照片中的人脸,包括鼻子,嘴巴,耳朵,眼睛和眉毛。、依托强大的脸部识别功能,可以高效的对人物全身皮肤进行智能识别,处理,使肤质平滑、过渡均匀。,这是网上下载的模糊照片,经过简单处理,你可以发现,眼睛变的更亮,皮肤更白,眼袋消失。

心语家园 - www.xinyucn.cc 2900

java实现生产者消费者问题(代码详解)

哇大王的达瓦

lwj_07的博客 9756

海康/大华设备如何接入GB28181平台?最新2022版互联避坑指南

本文详细解析了海康/大华设备接入GB28181平台的最新2022版互联避坑指南,涵盖参数配置、实时视音频点播协议交互及典型故障排查。重点介绍了GB/T28181-2022标准下的设备编码规范、SIP服务器配置及媒体流保活机制,帮助工程团队高效解决设备离线和媒体流中断等问题。

weixin_30733003的博客 687

启动launch文件时显示找不到franka_ign_ros2_control-system...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 695

『JAVA多线程·学习之路』-生产者消费者问题(有代码实现)

java多线程学习-生产者和消费者问题的学习总结,包含了代码实现。

Hhzzy99的博客 2260

WRFDA如何读取风云四号A 星的GIIRS数据?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1029

java多线程通信的经典例题:生产者消费者问题

java多线程有很多经典例题,比如窗口售票问题,生产消费问题。今天就在这里详细讲一下生产者消费者问题: 问题描述: 生产者(producer)将商品交给店员(Clerk),而消费者(Customer)从店员处取走商品,店员的货架上只能放一定数量的商品,如果生产者试图生产更多的商品,店员会叫生产者停一下,如果货架上有空位放商品再通知消费者继续生产。如果没有商品了,会告诉消费者等一下,如果店中有商品了再通知消费者来取走商品。 看到这个问题,我们不要去急着写代码,先来分析一下该题中会出现的多线程的知识点: 1.是

qq_45273552的博客 1669

【PostgreSQL】PostgreSQL数据库函数比对模板(PG通用)

LOOKUP 函数从单行或单列区域 (区域:工作表上的两个或多个单元格。区域中的单元格可以相邻或不相邻。)或数组 (数组:用于建立可生成多个结果或可对在行和列中排列的一组参数进行运算的单个公式。数组区域共用一个公式;数组常量是用作参数的一组常量。LOOKUP 函数具有两种语法形式:向量形式和数组形式。vlookup查找匹配值超过255个字符显示#Value的解决办法。如果值为错误值 #N/A,则返回 TRUE。

tttzzzqqq2018的博客 1494

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java多线程经典例题:生产者/消费者问题

生产者/消费者问题 题目描述: 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。 代码: class Clerk {/...

zjhzxjq的博客 2105

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java多线程总结六:经典生产者消费者问题实现

这是个线程同步的经典例子,源代码如下:   package demo.thread; /** *经典生产者与消费者问题:生产者不断的往仓库中存放产品,消费者从仓库中消费产品。 *其中生产者和消费者都可以有若干个。仓库容量有限,库满时不能存放,库空时不能取产品 */ public class ProducersAndConsumers { public static void ma

Touch_2011的专栏 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

多线程经典例题:生产者消费者店员问题

问题描述: 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图生产更多的产品,店员会叫生产者停一下, 如果店中有空位放产品了再通知生产者继续生产,如果店中没有产品了,店员会告诉消费者等一下,如果店中有产品了再通知消费者来取走产品。 这里可能出现两个问题: 生产者比消费者快时,消费者会漏...

tainxiawuti的博客 824

深入多线程十四:经典生产者与消费者问题,本质是线程通信问题

生产者和消费者共享的是同一个资源 (超市),生产者和消费者之间相互依赖和互为条件,所以 这是一个线程同步问题。在解决生产者消费者问题中,仅有我们之前系列所学的synchronized是不够的。虽然synchronized可以实现同步,阻止并发更新同一个共享资源,但是不能实现不同线程之间的通信。

一颗剽悍的种子的博客 700

经典问题:Python实现生产者消费者模式的多线程爬虫

经典问题:生产者与消费者模式,这次用Python实现多线程爬虫的写法

alijunshan的博客 952

关于多线程中经典场景自己实现:生产者和消费者问题

题目:有多个生产者往一个有界队列中添加消息,多个消费者消费该消息; 要求:在队列未满之前,消费者不消费消息,当队列未空之前,生产者不生产消息 我的思路: 首先,多个生产者之间是互斥的,避免把队列撑满溢出,需要用到锁,synchronized 其次:生产者和消费者之间是同步的,即:队列是否满 ok:直接上代码: package com.sf.interview.manyProduct; import...

qq_39203337的博客 332

经典多线程实例:生产者消费者问题

大部分人在理解Java的多线程这个问题有点困难,尤其是一些刚开始接触的编程语言是C语言的人。考虑到用C语言的人接触的都是一个主线程,下面给出的例子并没有太复杂的结构。主要是用来理解多线程的机制。 采用的例子:生产者消费者问题。 SyncStack存储WoTou Producer生产WoTou Consumer消费WoTou package com.exampl

我相信分享也是一种能力 1711

多线程通信经典例子:生产者/消费者问题

多线程通信一个经典例子:生产者/消费者问题 先一起来看一下题目 一个生产者(producer)生产一件产品,当产品数量超过20时将不再生产,另有一个消费者(consumer)问店员(clerk)来购买这个产品,当产品数量少于或等于时,店员将不再售卖这件产品 分析一下题目 需不需要使用多线程?需要,一条是生产者的线程,一条是消费者的线程 需不需要共享数据?需要,共享数据为店员,或者产品 共享数据的时候会不会出现线程安全问题?会,需要用synchronized或者lock来解决 需不需要线程之间进行通信?需要

Yellow_Star的博客 282
上一篇: 局部内部类中变量的fianl的规定
下一篇: oneinstack 安装 Nginx 失败 No such file or directory
Sweetbreads
博客等级 码龄10年 29粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值