生产者-消费者模式---Java多线程同步

生产者消费者问题(多生产者多消费者多缓冲区)——Java多线程 题目要求: 提供三种场景供用户选择: 1、单生产者单消费者单缓冲区 2、多生产者多消费者单缓冲区 3、多生产者多消费者多缓冲区 用户可以自由选择三种场景,并输入可选择参数。 场景解析 1、单生产者单消费者单缓冲区:为一对一的情况,所需要考虑的仅有生产者和消费者对缓冲区的互斥操作。 2、多生产者多消费者单缓冲区:不仅要考虑生产者消费者之间的互斥,为了避免多个生产者生产的产品放到缓冲区中的同一个位置、多个消费者消费同一个产品,还要考虑生产者之间、消费者之间的互斥关系。 3、多生产者多消费者多缓冲区:与前. 阅读详情

        当多个线程并发访问同一个资源时,可使用生产者-消费者模式解决,通常有信号灯法和管程法,本文使用信号灯法实现,其基本思想为:生产者生产时,消费者等待,生产结束后通知消费者消费;消费者消费时,生产者等待,消费完后通知生产者生产。需要Object类中wait()方法和notify()或者notifyall()方法配合使用。

        其中,wait()方法使得当前线程等待,直到另一个线程调用该对象的notify()或者notifyall()方法,wait()方法会释放锁资源(sleep 不释放锁);notify()或者  notifyall()方法唤醒等待的线程  ;wait()、 notify()必须和synchronized一起使用。

实例代码如下:flag为true--->生产者生产(play()方法)   消费者等待,生产完成后通知消费者; flag为false--->消费者消费(watch()方法)   生产者等待,消费完后通知生产者

public class Movie {
    private String pic;   //产品
    //信号灯
    private boolean flag = true;
    //播放
    public synchronized void play(String pic) {
        if(!flag) {   //生产者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //开始生产
        try {
            Thread.sleep(500);               //生产500ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //生产完毕 出来产品
        System.out.println("生产:"+pic);
        this.pic = pic;
        //通知消费
        this.notify();
        //生产者停下
        this.flag = false;
    }
    
    public synchronized void watch() {
        if(flag) {  //消费者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(200);   //消费200ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("消费:"+pic);
        //消费完毕
        this.notifyAll();
        //消费者停下
        this.flag = true;
    }
}

class Player implements Runnable{
    private Movie m;
    
    public Player(Movie m) {
        super();
        this.m = m;
    }

    @Override
    public void run() {
        for(int i=0;i<20;++i) {
            if(0==i%2) {
                m.play("蓝猫");
            }else
            {
                m.play("淘气");
            }
        }
    }
    
}

 

class Watcher implements Runnable{
    private Movie m;

    public Watcher(Movie m) {
        super();
        this.m = m;
    }

    @Override
    public void run() {
        for(int i=0;i<20;++i) {
            m.watch();
        }
    }
    
}

public class App {
    public static void main(String[] args) {
        //共同的资源
        Movie m = new Movie();
        //多线程
        Player p = new Player(m);
        Watcher w = new Watcher(m);
        new Thread(p).start();
        new Thread(w).start();
    }
}

单智能体篇:Prompt工程艺术 模型在接收到 Prompt 时会自动扮演“角色”,角色定义的好坏直接影响智能体输出的风格和专业性。角色定义的重要性让智能体具备明确身份,例如“你是一位专业理财顾问”或“你是一个幽默的文案创作助手”。角色限定了模型知识输出的范围,使回答更专业、更贴合预期。实战示例模糊Prompt给我一些投资建议。你可以投资股票或者基金。优化Prompt你是一位具有10年经验的专业理财顾问,请给我针对30岁男性,年收入20万,风险偏中等的投资组合建议。 阅读详情

相关推荐

L298N电机驱动模块的接线使用与代码实现

#include "iostm8s208mb.h" #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; // 关于LED灯的宏定义 #define LED2 PI_ODR_ODR2 //输出量 #define LE

Clichong 13万+

java多线程生产者与消费者问题_Java多线程详解之四:生产者消费者问题

一、问题描述生产者消费者问题(Producer-Consumer problem),也称有限缓冲区问题(Bounded-buffer promblem),是一个多线程同步问题的经典案例。对于一个固定大小的缓冲区,有两个线程共享该缓冲区----即“生产者”和“消费者”。顾名思义,“生产者”就是往缓冲区中添加数据的线程,“消费者”就是消耗缓冲区中数据的线程。如果不加以限制,当缓冲区满了的时候,如果“生...

weixin_28914371的博客 477

MTK-Display技术解析:从MDP到DDP的架构演进

本文深入解析了联发科(MTK)显示技术从MDP到DDP的架构演进。MDP作为多媒体数据预处理中心,负责格式转换与缩放;而DDP则整合了OVL、COLOR、AAL等模块,并引入CMDQ与场景化模式,实现了从分散处理到统一智能调度的飞跃,旨在提升画质、流畅度并降低功耗。

weixin_29218509的博客 253

猿来绘Java-35-线程的同步(生产者和消费者问题)

1.同步与互斥的理解 进程的同步: 一个进程的执行,依赖于另一个进程的运行的消息, 消息到达才能继续执行。 我们把异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。 进程同步:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系 进程的互斥: 两个或两个以上的进程,不能同时进入关于同一组共享变量的临界区域,否则可能发生与时间有关的错误,这种现象被称作进程互斥·也就是说,...

知行合一 291

算法竞赛推荐书单

前言 入坑算法竞赛已经一年半了,在这期间也读了不少关于算法竞赛的书,这些书对我的帮助还是蛮大的。平时看题解多是个人零散的题解,很难以系统的去学习,认认真真的挑选1-2本书来阅读,无论是从思维能力还是文字表达能力都会得到提升,以下都是我自己读过的书进行一下分享,难度由浅入深,部分书籍浅尝而止。 入门:《啊哈!算法》 适合:总题量150以下初步掌握C语言的萌新 一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松

TGX的博客 8241

ASP.NET Core Identity + Mysql(实战一)——注册登陆

在进行实战之前,我们先来了解一下Identity。 ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格、登录和用户数据存储。简单的来讲包括: 1.用户数据存储(使用任意你喜欢的关系型数据库,从sqllite到mysql、sqlserver等等,由Entity Framwork 支持) 2.登陆、注册外加身份认证(基于coo...

weixin_40359716的博客 1398

Java线程同步与通信(生产者消费者问题)

1.同步代码块 synchronized(Object o){ //同步代码 } public class WindowTest2 { public static void main(String[] args) { new Window2("窗口1").start(); new Window2("窗口2").start(); new Window2("窗口3").start(); } } class Window2 extends Th

weixin_44092159的博客 263

ESP32锂电池电量检测实战:从引脚选择到低功耗优化(附完整电路图)

本文详细介绍了ESP32锂电池电量检测的实战方案,从ADC引脚选择到低功耗优化,提供完整的电路图和代码实现。通过MOS管智能开关和深度睡眠技术,显著降低静态功耗至0.5μA,提升设备续航能力。适合物联网开发者解决电量检测中的常见问题。

weixin_28731223的博客 461

java 生产者和消费者问题,线程同步

1.使用Object.wait()和Object.notify() public class Test { private int queueSize = 10; private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize); public static void main(String[] args) { Test test = ne

az44yao的专栏 173

基于Python的链家与贝壳租房数据爬取及城市性价比分析

本文通过Python爬虫技术,实现对链家和贝壳平台全国主要城市租房数据的采集与分析。研究使用requestsSelenium和Playwright等现代化爬虫工具,结合代理IP和验证码识别技术应对反爬机制。采集的数据经过清洗后,从多维度分析不同城市租房市场的价格分布、面积特征和性价比差异,并使用可视化技术展示分析结果。本研究为租房者提供决策参考,也为租房市场研究提供数据支撑。关键词:Python爬虫;租房数据;数据分析;链家;贝壳。

2201_76125261的博客 530

小论文/大论文必备 | YOLO多模态目标检测、绘制曲线对比图 | 引入多种绘制曲线对比图,包括mAP0.5,mAP0.5:0.95,Loss损失变化的曲线对比

本文通过可视化方法分析YOLO多模态模型的训练过程,对比不同实验的检测精度和损失函数变化。主要内容包括:1)绘制mAP@0.5和mAP@0.5:0.95曲线评估检测精度;2)分析边界框回归损失(box_loss)、分类损失(cls_loss)和分布式损失(dfl_loss)的收敛趋势;3)提供完整的Python代码实现,支持多实验对比,可生成高清曲线图。该方法能直观展示模型训练效果,便于优化策略评估和参数调优。

Ai缝合怪、助力小伙伴高效发论文 260

Java线程同步-生产者消费者

Java线程间通信实践-生产者消费者 设计一个容器,生成者往里面加物品,消费者往里面拿物品。 很显然,这个容器需要一个同步机制,可以使用synchronized或者lock这里我在生产者put的时候判断容器是否满了,而在消费这get时判断容器是否为空。 注意: 这里使用wait时要注意要和while配合使用,防止并发情况下出现错误 使用notifyAll而不是使用notify,防止同类唤醒一个同...

qq_41797857的博客 299

1、2022 应用密码学与网络安全会议亮点与关键技术解读

2022年应用密码学与网络安全会议(ACNS 2022)在意大利罗马成功举办,会议涵盖了密码学与网络安全的多个前沿领域,包括键控全同态加密、隐私保护技术、区块链、后量子密码学和多方计算等。会议共收录44篇论文,展示了众多创新的研究成果,为学术研究和实际应用提供了新的思路和方法。本次会议促进了学术界和工业界的交流与合作,推动了密码学与网络安全行业的发展。

blue的专栏 182

java 生产者消费者_Java多线程-同步:synchronized 和线程通信:生产者消费者模式

一、同步:synchronized多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是加入同步后因为需要等待,所以效率相对低下。如:一个苹果,自己一个人去咬怎么都不会出问题,但是多个人同时去咬,这个时候如果控制不好,就可能会咬到对方了。 再强调一下是一个苹果。12306 中的...

weixin_39884074的博客 85

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java 多线程编程 生产者 消费者模式 (synchronized同步/ wait等待/ notify唤醒)

Java 多线程编程 生产者 消费者模式1. 消息类2. 生产者类3. 消费者类4. App.java 1. 消息类 消息数超过存放最大数, 则生产者线程阻塞(等待消费者消费后唤醒) 消息数等于空, 则消费者线程阻塞(等待生产者生产后唤醒) public class Message { /** 当前消息数量*/ private int count = 0; /** 信...

Shawn Jeon`s blog 376

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Rhyme/Java 多线程同步之生产者消费者模式

Java 多线程同步之生产者消费者模式1、问题产生背景我们在多线程访问同一份资源的时候,往往会出现线程的同步问题例如,我开了一家包子店,我们都知道必须先有包子,消费者才能消费。那么这里,店家即包子的生产者可以理解为一个线程,喜欢吃包子的消费者是另一个线程,这两个线程都访问同一份资源包子。现在,我们先假设没有多线程同步控制的情况,这个时候就相当于消费者线程和店主线程是没有所谓的先后顺序的,我们的CPU

RhymeChiang 439

Java多线程-同步:synchronized 和线程通信:生产者消费者模式

大家伙周末愉快,小乐又来给大家献上技术大餐。上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式。 一、同步:synchronized 多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性,...

bangyouyu7524的博客 205

delphi生产者消费者模式代码_Java多线程-同步:synchronized 和线程通信:生产者消费者模式...

大家伙周末愉快,小乐又来给大家献上技术大餐。上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式一、同步:synchronized多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是...

weixin_34856060的博客 85

java多线程通信同步_Java多线程-同步:synchronized 和线程通信:生产者消费者模式

大家伙周末愉快,小乐又来给大家献上技术大餐。上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式。一、同步:synchronized多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但...

weixin_32457141的博客 143

多线程调用同一个对象的方法_Java多线程-同步:synchronized 和线程通信:生产者消费者模式...

大家伙周末愉快,小乐又来给大家献上技术大餐。上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式一、同步:synchronized多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是...

weixin_39851809的博客 822

java多线程同步以及线程间通信详解&amp;amp;消费者生产者模式&amp;amp;死锁&amp;amp;Thread.join()(多线程编程之二)

多线程系列教程:java多线程-概念&amp;创建启动&amp;中断&amp;守护线程&amp;优先级&amp;线程状态(多线程编程之一)java多线程同步以及线程间通信详解&amp;消费者生产者模式&amp;死锁&amp;Thread.join()(多线程编程之二)java&amp;android线程池-Executor框架之ThreadPoolExcutor&amp;ScheduledThre...

zejian的博客 2万+

生产者消费者模式--java多线程同步方法的应用

生产者消费者模式是对java多线程的一个基础应用 我们一共设计了货物 生产者 消费者三个类 货物有商标和名称两个属性和对应的设置访问方法 生产者用于设置货物的属性 消费者用于访问并打印货物的属性 我们设置了一个生产者线程和两个消费者线程,其中生产者一次只能生产一批货物,由两个消费者争夺资源,代码如下 class Goods { private String brand; private Str...

朱同学的博客 370

java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)

多线程系列教程: java多线程-概念&创建启动&中断&守护线程&优先级&线程状态(多线程编程之一) java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二) java&android线程池-Executor框架之ThreadPoolExcutor&ScheduledThreadPoolExecutor浅析(多线程编程之三) Jav

geekczt 903

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

这是java开发时常用到的模式,可以使程序在设计时分开生产者和消费者之间的相互调用。模式中需要建立三个对象:生产者  消费者  仓库生产者:把生产出来的产品放到仓库总消费者:从仓库中取出产品进行消费仓库:采用同步方法,对仓库上锁同步,每次只能有一个对象对其进行操作。类图如下:仓库类代码:使用队列的方式实现package com.consume; import java.util.concurrent.ArrayBlockingQueue; import org.slf4j.Logger; im

积跬步 行千里 1394

多线程之生产者和消费者模式

package com.git.base.thread.productandconsumer; /** * 核心实现: * 生产者消费者模式: * 生产一个,消费一个,如果生产未被消费,那么就等待消费后再生产 * 如果消费后,没有下一个生产的,就等待生产后在消费 * Title: DoMain.java * Description: * Copyright: Copyright (

筑梦者 3063

Java多线程实现生产者消费者模式

Java多线程实现生产者消费者模式 Java多线程实现生产者消费者模式 在我学到java多线程的时候,老师让写一个生产者消费者模式,实现生产消费同步进行,但是仓库库存低于30%时消费者无法购买产品,库存满时生产者无法生产。 关键代码 下面展示一些 关键代码仅供参考。 1.生产者类 package com.jql.homework3; /** * 生产者 */ public class Pro...

WebSpider_1的博客 380
上一篇: JAVA中线程同步
下一篇: dom4j的jar包下载
BEYONDMAZE
博客等级 码龄9年 8粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值