生产者,消费者

2023-05-16

生产者,消费者

lock

//生产者消费者  lock
public class PC02 {
    public static void main(String[] args) {
        datas da=new datas();
        new Thread(()->{
            for(int i=1;i<=10;i++){
                da.producter();
            }
        },"p1").start();

        new Thread(()->{
            for(int i=1;i<=10;i++){
                da.consumer();
            }

        },"c1").start();
    }
}
class datas{
    private int num=0;
    Lock  lock=new ReentrantLock();
    Condition cond= lock.newCondition();//

    //生产者
    public void producter() {
        lock.lock();
        try {
            while(num!=0){ //这里,必须使用while,wait()必须在循环里,不能if()判断语句,当线程过多时,容易出现虚假唤醒
                //等待
                cond.await();
            }
            //生产
            System.out.println(Thread.currentThread().getName()+"生产产品"+(++num));
            //通知
            cond.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            lock.unlock();

        }
    }
    //消费者
    public  void consumer() {
        lock.lock();
        try {
            while(num==0){
                //等待
                cond.await();
            }
            //消费
            System.out.println(Thread.currentThread().getName()+"消费产品"+(num--)+"剩余产品"+num);

            //通知
            cond.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}

synchronized

//生产者消费者  synchronized
public class PC01 {

    public static void main(String[] args) {
        data da=new data();
        new Thread(()->{
            for(int i=1;i<=10;i++){
                da.producter();
            }
        },"p1").start();

        new Thread(()->{
            for(int i=1;i<=10;i++){
                da.consumer();
            }

        },"c1").start();
    }

}
class data{
    private int num=10;
    //生产者
    public synchronized void producter() {
        while(num>0){ //这里,必须使用while,wait()必须在循环里,不能if()判断语句,当线程过多时,容易出现虚假唤醒
            //等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        //生产
        System.out.println(Thread.currentThread().getName()+"生产产品"+(++num));

        //通知
        notifyAll();

    }
    //消费者
    public synchronized void consumer() {
        while(num==0){
            //等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //消费
        System.out.println(Thread.currentThread().getName()+"消费产品"+(num--)+"剩余产品"+num);

        //通知
        notifyAll();

    }
}

管程法

//生产者消费者问题:管程法
public class PCThread {
    public static void main(String[] args) {
        Buffers bf = new Buffers();
        new Thread(new Productor(bf)).start();
        new Thread(new Consumer(bf)).start();
    }
}
//生产者
class Productor implements Runnable {
    public Buffers bf;
    public Productor(Buffers bf) {
        this.bf = bf;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            bf.push(new Product(i));
            System.out.println("生产第" + i + "个产品");
        }
    }
}
//消费者
class Consumer implements Runnable {
    public Buffers bf;
    public Consumer(Buffers bf) {
        this.bf = bf;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println("消费第" + bf.pop().id + "个产品");
        }
    }
}

class Product {
    public int id;
    public Product(int id) {
        this.id = id;
    }
}

//缓冲区
class Buffers {
    Product[] products = new Product[10];
    int count = 0;
    //生产者 生产产品
    public synchronized void push(Product product) {
        if (count == products.length) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        products[count] = product;
        count++;
        this.notifyAll();
    }
   //消费者消费
    public synchronized Product pop() {
        if (count == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        count--;
        Product pt = products[count];

        this.notifyAll();
        return pt;
    }
}

BlockingQueue 阻塞队列法

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

//生产者消费者  BlockingQueue  阻塞队列法
public class PC_bq {
    public static void main(String[] args) {
        BlockingQueue<String> block=new LinkedBlockingQueue<>(2);//默认大小为Integer.MAX_VALUE
     Producter p=new Producter(block);
     consumer c=new consumer(block);
     for(int i=0;i<5;i++){
         new Thread(p,"producet"+(i+1)).start();

         new Thread(c,"consume"+(i+1)).start();
     }
    }
}
class Producter implements  Runnable{
    BlockingQueue<String> bq;

    public Producter(BlockingQueue<String> bq) {
        this.bq = bq;
    }
    @Override
    public void run() {

        try {
            String msg="消费一个产品,生产线程是"+Thread.currentThread().getName();
            System.out.println( Thread.currentThread().getName()+"生产了一个产品,before put");
            bq.put(msg);//队列满的话,会阻塞
           System.out.println( Thread.currentThread().getName()+"生产了一个产品,afterd put"  );
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class consumer implements  Runnable{
    BlockingQueue<String> bq;

    public consumer(BlockingQueue<String> bq) {
        this.bq = bq;
    }

    @Override
    public void run() {
        try {
            String msg= bq.take();
            System.out.println(msg);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生产者,消费者 的相关文章

  • 电池连接接触电阻的优化研究

    金属与金属接触处的接触电阻主要受以下因素影响 xff1a 表面结构机械负载 表面结构可以通过表面平整度 表面氧化和吸水性进一步描述 电池组中的这些接头将采用焊接或螺栓连接方式 最初最容易想到的是螺栓母线接头 螺栓扭矩可用于估算力 xff0c
  • (二)CAS统一认证——自定义登录(数据库)

    简介 关于CAS的登录流程 xff0c overlay中只是一个简单的用户名密码登录 casuser Mellon xff0c 这个肯定是不能满足日常生产的需求的 xff0c 在日常开发中遇到最通用的情况就是从数据库中进行身份认证密码的比对
  • springcloud

    一 什么是SpringCloud xff1f Author xff1a 呆萌老师 QQ 2398779723 微信 it daimeng Spring Cloud是一个微服务框架 xff0c 相比Dubbo等RPC框架 Spring Clo
  • 计算机操作系统学习之多生产者多消费者问题

    文章目录 一 问题描述二 问题分析1 关系分析2 整理思路3 设置信号量4 具体实现5 补充 一 问题描述 有一个盘子 xff0c 每次只能放一个水果父亲专门往盘子里放苹果 xff0c 母亲专门往盘子里放橘子女儿专门等着吃盘子里的苹果 xf
  • 姿态角与欧拉角的关系

    1 姿态角与欧拉角 姿态角 xff1a 指的是机体坐标系与地理坐标系的夹角 欧拉角 xff1a 绕机体坐标系三个轴旋转的角度 关系 xff1a 绕某种旋转顺序的欧拉角与姿态角相等 xff08 1 xff09 在NED 北东地 坐标系 xff
  • 从入门到进阶,JAVA书籍的最佳阅读顺序!

    本文首发于知乎 xff0c 已获得1000 43 赞和收藏 原文链接 xff1a https www zhihu com question 269505829 answer 1791006152 先介绍下本人的情况 xff0c 希望对大家学
  • 设计数据密集型应用-C5-主从架构及同步延迟问题

    本文是 设计数据密集型应用 第5章学习笔记 什么是Replication Replication是在多台机器上维护的相同的数据 xff0c 即副本 保存副本的原因有以下几种 xff1a 减小延迟 xff1a 使得地理位置上数据离访问者更近
  • 第一条Pulsar消息发送

    什么是Pulsar pulsar是一个多租户 高性能server to srever消息解决方案 xff0c 最初由雅虎开发 xff0c 现在由apache维护 Pulsar的核心特性 xff1a 多集群云原生支持低延迟 良好的伸缩性多语言
  • 2014找工作总结-机会往往留给有准备的人

    转发请注明出处 xff1a 2014找工作总结 机会往往留给有准备的人 计算机专业同学的充电站 CSDN博客 其实我的求职过程在十一之前就已经结束了 xff0c 总体讲比较顺利 参加面试的几家公司基本都拿到了offer xff0c 分别是阿
  • 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现

    通过我这些天用C 43 43 读写bmp图像的经历 xff0c 摸索再摸索 xff0c 终于对bmp文件的结构 操作有了一定的了解 xff0c 下面就大概介绍bmp图片纯C 43 43 的读取 旋转和保存的实现过程 要用C 43 43 读取
  • 【数字图像处理】直方图均衡化详解及编程实现

    直方图均衡化的英文名称是Histogram Equalization 图像对比度增强的方法可以分成两类 一类是直接对比度增强方法 另一类是间接对比度增强方法 直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法 直方图拉伸是通过对比度拉
  • 【GPU编程】体绘制传输函数-分类(Volume Rendering Transfer function:Pre- VS Post-Classification)

    在科学可视化中 xff0c 我们所获得的体数据集经常是代表一些光学上的不同物理属性的单值 通常没有可行的方法可以从这样的数据中获得发射和吸收属性 因此用户必须采用某种映射方法给数据值分配光学属性值来决定数据中的不同结构的模样 这离的映射就被
  • 【OpenGL】理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式

    GL TRIANGLE STRIP绘制三角形方式很多时候令人疑惑 xff0c 在这里对其运作机理进行解释 一般情况下有三种绘制一系列三角形的方式 xff0c 分别是GL TRIANGLES GL TRIANGLE STRIP和GL TRIA
  • OpenJDK与JDK的区别分析

    OpenJDK与JDK的区别分析 一 以下是具体分析 xff1a 使用过LINUX的人都应该知道 xff0c 在大多数LINUX发行版本里 xff0c 内置或者通过软件源安装JDK的话 xff0c 都是安装的OpenJDK xff0c 那么
  • 【C++深入探索】Copy-and-swap idiom详解和实现安全自我赋值

    任何管理某资源的类比如智能指针需要遵循一个规则 xff08 The Rule of Three xff09 xff1a 如果你需要显式地声明一下三者中的一个 xff1a 析构函数 拷贝构造函数或者是拷贝赋值操作符 xff0c 那么你需要显式
  • 【Linux】Vim编辑器-批量注释与反注释

    vim编辑器 批量注释与反注释 在使用vim编写代码的时候 xff0c 经常需要用到批量注释与反注释一段代码 下面简要介绍其操作 方法一 块选择模式 插入注释 xff1a 用v进入virtual模式 用上下键选中需要注释的行数 按Contr
  • 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历

    一 图的表示 图G 61 V E 要表示一个图 xff0c 通常有两种方法 xff1a 邻接表和邻接矩阵 两种方法都既可以表示有向图 xff0c 也可以表示无向图 邻接表表示由一个包含 V 个列表的数组组成 xff0c 其中每个列表对应V中
  • 【笔试面试题】腾讯2013实习生面试算法题及参考答案

    总结了一下自己遇到的以及同学遇到的面试算法题 xff0c 是技术二面 有几道题给出了参考答案 xff0c 还有几道没有好的思路 路过的大侠如果有好的思路请留个言交流下呗 1 八数码问题 xff1a 3 3的格子 xff0c 有1 8个数 x
  • 【Linux学习】epoll详解

    什么是 epoll epoll 是什么 xff1f 按照 man 手册的说法 xff1a 是为处理大批量句柄而作了改进的 poll 当然 xff0c 这不是 2 6 内核才有的 xff0c 它是在 2 5 44 内核中被引进的 epoll
  • 算法设计应该依赖抽象而不是业务

    很多时候 xff0c 算法的设计是归属于详细设计阶段的 一些公司甚至都没有设计而直接编码 这些往往导致很多算法的实现都混杂在业务模块中 典型的特点是 xff0c 这些算法会依赖于业务实体的某些属性的实现 举一个简单的例子 xff0c 我曾经

随机推荐

  • 做程序员老婆的幸福

    刚好看网上一个写程序员老公的 说说程序员老公的一些事情 请帮忙分析是不是典型程序员 xff0c 想起自己就是一个程序员 xff0c 也是一个老公 xff0c 却不以为然起来 虽然不以为然 xff0c 却并没有驳斥的任何意思 毕竟很多人都不一
  • 好习惯成就好程序员

    公司搞了一次技术峰会 xff0c 我有机会和大家聊了一下有关如何成功的问题 会上我向大家提出了我的想法 xff0c 好习惯才能成就好程序员 有很多人可能对这句话很不以为然 xff0c 我也不忙辩解 xff0c 先回答我下面的一个问题 现在我
  • 程序江湖:第三章 莫等闲白了少年头

    周五因为羽毛球比赛 xff0c 没有更新 xff0c 今天继续 读者反馈 xff1a 很多读者反馈主人公的名字比较土 呵呵这个没关系 xff0c 可以在整理的时候统一修改 另外有些人表示特别希望看到职场的故事 xff0c 这个放心 本就是这
  • 程序江湖:第二十章 讲标的前一晚上

    说明 xff1a 非常抱歉 xff0c 这周参加了太多的会议 原来写作也是需要心情的 xff0c 当没有心情的时候 xff0c 你都懒得动笔 欧阳明来到云南的最主要的目的 xff0c 是为了应对昆明客户要求的评标 就是客户邀请了几家资质还可
  • springboot项目搭建

    一 Springboot 基本概念 1 1 什么是 springboot Spring Boot是由Pivotal团队提供的全新框架 xff0c 其设计目的是用来简化新Spring应用的初始搭建以及开发过程 该框架使用了特定的方式来进行配置
  • 管理 VS. 面向对象设计

    我是在吃虾的时候 xff0c 突然想起这个关联的 管理 xff0c 往往就是给你一堆事 xff0c 然后再给你一些人 xff0c OK xff0c 你去做吧 这是你的使命 下面我们来做类比吧 首先一个问题 xff0c 你是认为人重要 xff
  • 技术管理案例:代码规范还要继续推行吗?

    这是实际工作中总结的一个典型案例 是真实的 写出来供大家参考 案例 xff1a 技术经理 Y 今年新到了一个产品部门 xff0c 发现原来产品的代码很乱 xff0c 遗留的问题很多 而现有的人员 xff0c 又大半是新招的 xff0c 很多
  • 苹果成功的根本:统筹创新

    这周的某天中午 xff0c 我们聊起了这个话题 xff0c 是关于苹果为什么成功的话题 很多人都说是因为苹果的创新能力很强 但是诺基亚也不缺乏创新啊 xff01 为什么苹果就能胜出呢 xff1f 我个人认为这有很多方面是因为乔布斯 xff0
  • 建立健康的职业发展观

    Google的Reader要下线了 xff0c 很多人都说这是因为Blog的没落 微博的兴起 xff0c 确实给了很多人表达情绪的方式 如果我能够用140个字 xff0c 清晰的表达我的观点 xff0c 并且能够让我的读者做到一点点认可 x
  • Android Gradle Plugins系列-01-自定义Gradle插件入门指南

    前言 本文内容已经有很多大佬写过了 xff0c 不过这里为了知识体系的完整 xff0c 就再写一遍 xff0c 并加入Maven Publish插件的使用 xff0c 不感兴趣跳过就好 官方文档 xff1a Developing Custo
  • Android Gradle Plugins系列-02-Maven Publish 插件踩坑指南

    前言 可能有读者会疑惑 xff0c Maven Publish 插件又是啥玩意 xff1f 确定不是Maven插件吗 xff1f 不要逗我 让笔者慢慢道来 xff0c 如果你刚好把AndroidStudio升级到Android Studio
  • Android Jetpack系列-实现Application作用域的共享ViewModel用于Activity和Fragment的相互通信

    目录 前言 搞清楚activityViewModels的本质 定义Application作用域的ViewMode ApplicationViewModelLazy BaseViewModelApplication 使用方法 自定义Appli
  • Android 音视频开发实践系列-04-Android WebRTC推流到SRS服务器实现直播功能

    目录 前言 了解WebRTC 部署SRS服务器 下载源码并运行 可能遇到的问题 create session create session add publisher publish negotiate no found valid H 2
  • 搭建Android日志系统 美团点评大前端Logan入门指南

    目录 前言 总览 快速开始 下载官方源码 使用IDEA打开Logan Server项目 使用Docker下载MySQL镜像并启动容器 运行Logan Server 修改db properties 修改log4j properties 配置M
  • Android代码重构系列-03-用了Kotlin就别再用Java的思维写代码了(持续更新)

    前言 还记得刚开始在正式项目上用Kotlin写代码时 xff0c 很多代码是直接复制Java过来转成Kotlin的 xff0c 结果代码Review的时候被评论成是用Java的思维写Kotlin代码 xff0c 完全没有利用到Kotlin的
  • springboot项结构分析

    三 SpringBoot 结构 3 1 SpringBoot 工作原理 Spring boot应用程序采用各种Starters启动器 入口类是包含 64 SpringBootApplication注解和main方法的类 然后使用 64 Co
  • Android 音视频开发实践系列-06-初步了解H.264视频编解码技术标准

    本文来自笔者本人的语雀博客 xff0c 由于语雀升级后不再满足笔者的需求 xff0c 因此之后笔者会陆续将一些之前已经发布但尚有价值的文章搬家到CSDN 1 前言 作为音视频行业从业者 xff0c 怎么能不理解H 264视频编解码技术标准
  • 记一次Git未Commit直接Pull导致本地代码丢失后的挽救过程

    第一次遇到这种问题 xff0c 有点紧张 好吧 xff0c 废话不多说 xff0c IDEA或者AndroidStudio进入Git Uncommiteed Changes gt Unstash Changes xff1a 在弹出的Unst
  • java异常处理(较详细)

    在使用计算机语言进行项目开发的过程中 xff0c 即使程序员把代码写得尽善尽美 xff0c 在系统的运行过程中仍然会遇到一些问题 xff0c 因为很多问题不是靠代码能够避免的 比如 xff1a 客户输入数据的格式 xff0c 读取文件是否存
  • 生产者,消费者

    生产者 xff0c 消费者 lock span class token comment 生产者消费者 lock span span class token keyword public span span class token keywo