多线程生产者与消费者问题的总结

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


  1. class Resource{  
  2.     private String name;  
  3.     private int count;  
  4.     private boolean flag;  
  5.       
  6.     public synchronized void set(String name){  
  7.         while(flag){  
  8.             try {  
  9.                 wait();  
  10.             } catch (InterruptedException e) {  
  11.                 e.printStackTrace();  
  12.             }  
  13.         }  
  14.         this.name = name+“—”+count++;  
  15.         System.out.println(Thread.currentThread().getName()+”生产者”+this.name);  
  16.         flag = true;  
  17.         notifyAll();  
  18.           
  19.     }  
  20.     public synchronized void get(){  
  21.         while(!flag){  
  22.             try{  
  23.             wait();  
  24.             }catch(InterruptedException e){  
  25.                 e.printStackTrace();  
  26.             }  
  27.         }  
  28.         System.out.println(Thread.currentThread().getName()+”–消费者–”+this.name);  
  29.         flag = false;  
  30.         notifyAll();  
  31.     }  
  32. }  
  33.   
  34. class Producer implements Runnable{  
  35.     private Resource res;  
  36.       
  37.     Producer(Resource res){  
  38.         this.res = res;  
  39.           
  40.     }  
  41.       
  42.     public void run(){  
  43.         while(true){  
  44.             res.set(”+商品+”);  
  45.         }  
  46.     }  
  47. }  
  48.   
  49. class Consumer implements Runnable{  
  50.     private Resource res;  
  51.     Consumer(Resource res){  
  52.         this.res = res;  
  53.     }  
  54.       
  55.     public void run(){  
  56.         while(true){  
  57.             res.get();  
  58.         }  
  59.     }  
  60. }  
  61.   
  62. public class ProducerConsumer {  
  63.     public static void main(String[] args) {  
  64.         Resource res = new Resource();  
  65.         Producer pro = new Producer(res);  
  66.         Consumer con = new Consumer(res);  
  67.         Thread t1 = new Thread(pro);  
  68.         Thread t2 = new Thread(con);  
  69.         Thread t3 = new Thread(pro);  
  70.         Thread t4 = new Thread(con);  
  71.           
  72.         t1.start();  
  73.         t2.start();  
  74.         t3.start();  
  75.         t4.start();  
  76.   
  77.     }  
  78.   
  79. }  
class Resource{
    private String name;
    private int count;
    private boolean flag;

    public synchronized void set(String name){
        while(flag){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.name = name+"---"+count++;
        System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
        flag = true;
        notifyAll();

    }
    public synchronized void get(){
        while(!flag){
            try{
            wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName()+"--消费者--"+this.name);
        flag = false;
        notifyAll();
    }
}

class Producer implements Runnable{
    private Resource res;

    Producer(Resource res){
        this.res = res;

    }

    public void run(){
        while(true){
            res.set("+商品+");
        }
    }
}

class Consumer implements Runnable{
    private Resource res;
    Consumer(Resource res){
        this.res = res;
    }

    public void run(){
        while(true){
            res.get();
        }
    }
}

public class ProducerConsumer {
    public static void main(String[] args) {
        Resource res = new Resource();
        Producer pro = new Producer(res);
        Consumer con = new Consumer(res);
        Thread t1 = new Thread(pro);
        Thread t2 = new Thread(con);
        Thread t3 = new Thread(pro);
        Thread t4 = new Thread(con);

        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }

}


windows下多线程(生产者消费者问题:3个生产者,一个消费者,4个缓冲区) 原作者提供源码为两种情况: 第一种:1生产者1消费者1缓冲区 第二种:1生产者 2消费者 4缓冲区 ========================下面为修改作者源码得到的 3个生产者1个消费者4个缓冲区的情况==================  //1生产者 2消费者 4缓冲区 #include #include #include //设置控制台输出颜 阅读详情

相关推荐

c++多线程生产者与消费者问题代码

c++多线程生产者与消费者问题代码

rain_while的博客 6017

用多线程实现“生产者-消费者问题”(代码+实验报告)

 用多线程实现“生产者-消费者问题”(代码+实验报告) #include  #include  #include  #include  using namespace std;typedef int semaphore;                          /* 信号量是一种特殊的整型变量 */    const int SIZ

叶现一的专栏 1万+

c++多线程 (生产者消费者问题)

针对多线程中常见的生产者消费者问题,封装了一个类,和测试代码,方便日后直接套用。 具体来说就是多线程使用时候经常遇到的 一个线程取数据,一个处理数据,一个保存或传递数据。

何似莫相逢 6078

多线程学习之生产者与消费者

感悟:   生产者和消费者其实就是一个很简单的一个多线程同步的例子,但是我却花了好多天才能理解。反思下来就是缺乏实践,这听起来感觉很简单的一个道理,但是能做到可就很难了。当初在看这个生产者和消费者实例的时候,看着感觉代码能简单,大致上能理解,但是到了转天自己却又写不出来了,才知道是自己还没有理解透彻。现在动了一次手实践一番以后,不说理解透彻,理解个90%还是没问题的。 基础准备: notify(...

树叶的一生,只是为了归根么? 298

Java多线程--生产者与消费者问题

Java多线程--生产者与消费者问题

人生得意须尽欢 1970

分位数映射数据后处理-Quantile Mapping后处理 (R语言)

统计后处理器基本上是统计模型,将观察到的关注变量与从气象或水文模型的直接模型输出(DMO)导出的适当预测变量相关联。统计后处理的重要性早已在气象预报中得到认可。早期的工作包括完善的预测(perfect prognosis),模型输出统计(MOS)和模拟方法(analog method)等模型。 近年来,已经提出了许多其他后处理方法,包括秩直方图校准(rank histogram calibrati...

水滴石穿,绳锯木断 1万+

操作系统实验二总结(生产者消费者问题)

为了这个实验二,资料查了巨多,pv操作什么的好不容易弄明白了,但是感觉老师要求的好像用不到这个。 大部分都是某位同学的成果哈哈哈。 自己总结了一下: 1.队列和链表在c++中是可以直接用已经有的模板的。 2.学会用指针进行遍历。 3.消费者要是能放到buffer里就看生产者等待队列里有没有人,有人就唤醒一个生产者。 4.要是buffer只有1那么大,最终完成链表中必定是生产者和消费者交...

小王同学的博客 1万+

基于ensp大学网络规划与设计(完整文档+ensp拓扑图)

大家好,我是小华学长,一名计算机领域的博主。经过多年的学习和实践,我积累了丰富的计算机知识和经验,在这里我想与大家分享我的学习心得和技巧,帮助你成为更好的程序员。 作为一名计算机博主,我一直专注于编程、算法、软件开发等领域,在这些方面积累了大量的经验。我相信分享是一种双赢的方式,通过分享,我可以帮助他人提升技术水平,同时也能够得到学习交流的机会。 在我的文章中,你将会看到我对于各种编程语言、开发工具以及常见问题的解析和分析。我会结合自己的实际项目经验,为你提供实用的解决方案和优化技巧。我相信这些经验不仅能够

qq1325513482的博客 5万+

【java 多线程】多线程并发同步问题及解决方法

一、线程并发同步概念 线程同步其核心就在于一个“同”。所谓“同”就是协同、协助、配合,“同步”就是协同步调昨,也就是按照预定的先后顺序进行运行,即“你先,我等, 你做完,我再做”。 线程同步,就是当线程发出一个功能调用时,在没有得到结果之前,该调用就不会返回,其他线程也不能调用该方法。 就一般而言,我们在说同步、异步的时候,特指那些需要其他组件来配合或者需要一定时间来完成的任务。在多线程编程...

weixin_30699831的博客 1825

433MHz无线通信避坑指南:如何解决信号干扰和误码问题

本文深入探讨433MHz无线通信中的信号干扰和误码问题,提供从射频前端设计到协议优化的全链路解决方案。通过天线匹配、电源噪声抑制、曼彻斯特编码改进及实时频点切换等技术,显著提升通信稳定性和距离。适合智能家居和工业无线控制系统的开发者参考。

weixin_29288313的博客 419

【Tableau】解决订阅报表PDF中文显示为乱码(方框)问题

一、问题描述 在tableau server网页端报表中文字符能正常显示,但在订阅后发送到邮箱时,以图片格式呈现的内容中中文字符显示为方框。 网页端报表能正常显示中文字符: 邮件中的报表不能正常显示中文字符: 二、问题分析 网页端字符显示情况是由html编码决定的,而tableau生成图片时是通过所部署的服务器的字体文件显示字体。因此可能是由于Linux服务器缺失相关的字体文件导致网页端选择的中文字体在服务器上缺失对应的字体文件导致的。则考虑在服务器引入对应的字体文件。 三、问题解决 1、查看服务器现有

why_not_study的博客 2833

多线程-生产者消费者问题、线程池

(—接上篇《多线程-线程的生命周期、线程同步与死锁》的完善) 一、线程池工作原理步骤   步骤: 核心线程池,声明时预估的数量,池内数量的线程同时进行执行,如果没满则新建一个线程处理刚提交来的任务,若池内线程全部在执行任务,进入下一步。 阻塞队列,核心线程池满了后再有线程会判断阻塞队列是否满了,阻塞队列没满就将任务放入阻塞队列中,没满就进入下一步。 线程池,判断线程池中所有的线程是否都在执行任务...

qq_36268025的博客 394

借助Gemini 3 Pro高效解决课题申报中的五大核心痛点,亲测有效经验分享

之前给大家分享过关于AI辅助课题申报的相关的内容,涵盖了申报书部分撰写技巧,但没针对性拆解各位同仁在实际申报时遇到的卡壳的地方。比如选题范围拿捏不准,定的太大,根本没法落地完成;定的太小,研究价值则体现不了;写综述时,容易单纯罗列文献,缺乏批判性视角,没办法自然融入自己的判断,找不到研究缺口;研究方法部分,可能担心方法设计不够严谨,别人难以复现.....针对这些申报中的高频痛点,接下来七哥会从五个核心要点出发,借助Gemini 3 Pro高效解决这些痛点。

智能AI让学术科研更容易 701

多线程之生产者与消费者问题

生产者消费者问题(Producer-consumer problem):生产者不断地生产产品,消费者取走生产者生产的产品。生产者生产出产品后将其放到一个区域之中,消费者从这个地方去除数据。 涉及的问题:要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 主要涉及:多线程的同步问题。 1、假设生产者线程刚向数据存储空间添加了产品的名称,还没有添加产品的内容,程序就切到了消费者的线程,消费这的 线程将吧产品的名称和上

Andyの笔记 2159

5、模糊风险评估

本文介绍了基于模糊逻辑的风险评估方法,探讨了如何在不确定、不完整信息环境下进行高效的风险分析。文章涵盖了模糊集合与隶属度函数的基本概念、模糊推理系统的流程,并结合犯罪风险、金融风险和医疗诊断等实际案例,展示了模糊风险评估的应用价值和技术细节。此外,还介绍了模糊贝叶斯网络、模糊综合评价等进阶工具与方法,为多领域风险管理提供了理论支持和实践指导。

mango的博客 180

28、基于图像快速序列视觉呈现(RSVP)的脑机接口特征提取与分类算法综述

本文综述了基于图像快速序列视觉呈现(RSVP)的脑机接口(BCI)中的特征提取与分类算法。RSVP技术通过快速连续呈现图像序列,结合脑电图(EEG)信号分析,实现对目标图像的识别和标记。文章详细介绍了RSVP实验的设计、EEG数据的采集与预处理,并探讨了低信噪比、维度灾难、重叠epoch和不平衡数据集等挑战。针对特征提取,讨论了有监督空间滤波方法(如CSP、xDAWN、LDA波束形成器)的原理和应用。在分类策略部分,涵盖了线性分类技术(如LDA、BLR、LR、SVM)和非线性分类方法(如MLP、CNN)。文

hh234的博客 337

多线程的生产者和消费者问题

多线程的生产者和消费者问题是比较经典的多线程问题,如果知道编码解决生产者和消费者问题,那么对于多线程应该基本算掌握了。我不知道大家的生产者和消费者问题是怎么样的(应该有几个版本吧),这里我说下我的生产者和消费者问题: 有多个生产线程,他们只负责生产资源;有多个消费者,同样他们只负责消费。但是他们需要满足下面条件: 生产者:只有当资源没有的时候,生产者才开始生产,但是为了防止浪费,每次只能生产指定数量的资源。当生产者生产完足够资源时,就进入睡眠,同时叫醒消费者去消费;

YuZhiHui_No1的专栏 3390

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

多线程之消费者生产者问题

消费者生产者问题: 这个问题是一个多线程同步问题的经典案例,生产者负责生产对象,消费者负责将生成者产生的对象取出,两者不断重复此过程。这过程需要注意几个问题: 不论生产者和消费者有几个,必须保证: 1.生产者每次产出的对象必须不一样,产生的对象有且仅有出现一次; 2.消费者每次取出的对象必须不一样,取出的对象有且仅有出现一次; 3.一定是先产生该对象,然后对象才能被取出,顺序不能乱; ...

zjt980452483的博客 4554

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java多线程之生产者消费者经典问题

今天研究了一下java多线程,顺便写了一下多线程中的经典问题-----生产者消费者经典问题,参照了网上的各种写法之后自己写了一个,如下所示 /**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者、消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里是馒头类 * 第四,既然是线程,那么就不是一对

亡羊补牢 5万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

这个实现使用了信号量和互斥锁来保证线程安全,避免竞态条件。生产者会持续向缓冲区添加项目,而消费者会持续从缓冲区取出项目,直到loops变量减到0。这是一个多线程的生产者-消费者问题实现。

XLYcmy的博客 1663

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

Java多线程实现生产者消费者问题 问题描述: 假设在汉堡店中,有最多能放10个汉堡的窗口,有生产汉堡的厨师,还有前来消费汉堡的消费者。厨师在窗口没摆满汉堡时一直生产汉堡放到窗口,消费者在窗口有汉堡时能进行消费。 模型抽象: 生产者(厨师):新加产品到缓冲池,当缓冲池产品达到最大值(满了)时进入wait状态。 消费者:提取缓冲池中的产品,当缓冲池产品为空时进入wait状态等待 缓冲池(窗口):存放...

qq_41257358的博客 1700

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

继经典线程同步问题之后,我们来看看生产者消费者问题及读者写者问题。生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区

dazhong159的专栏 4472

多线程同步中的生产者消费者问题

生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),它在多线程同步问题中是一个经典案例,那么什么是生产者-消费者问题?

m0_73537205的博客 1599

Linux 系统应用编程——多线程经典问题(生产者-消费者)

“生产者——消费者”问题是Linux多线程编程中的经典问题,主要是利用信号量处理线程间的同步和互斥问题。          “生产者——消费者”问题描述如下:           有一个有限缓冲区(这里用有名管道实现 FIFO 式缓冲区)和两个线程:生产者和消费者,它们分别不停地把产品放入缓冲区中拿走产品。一个生产者在缓冲区满的时候必须等待,一个消费者在缓冲区空的时候也不IXUS等待。另外,因

知秋一叶 1万+

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

在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存。这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题。题目如下:有苹果橘子生产者各20个,有苹果橘子消费者各20个,他们公用20个缓存区。要求能随时查看缓存区内容,随时查看生产消费内容情况,随时暂停生产开始生产。我们的实现思路:1.首先创建一个缓存区类,其中包含...

weixin_31887861的博客 207
上一篇: Java集合框架及其区别
下一篇: 数组常用方法的总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值