多线程———生产者和消费者(等待唤醒机制)彻底理解以及代码实现

news2024/9/22 23:05:44

目录

一、何为等待唤醒机制(生产者消费者模式)?

如何实现等待唤醒机制?

二、等待唤醒机制(生产者消费者模式)代码实现:

1、生产者代码:

2.桌子代码(控制生产者和消费者):

3.消费者代码:

4.测试结果代码:

5.结果截图:


一、何为等待唤醒机制(生产者消费者模式)?

线程的执行具有随机性,哪个线程抢到执行权才会执行。如果程序中有两条线程AB,那他们的执行顺序可能是:

 等待唤醒机制就是要打破随机执行规则,让两个线程轮流执行:

如何实现等待唤醒机制?

设置A线程生产者去生产数据,B线程消费者去消费数据。我们可以把生产者看做一个厨师,消费者看做是一个顾客。顾客进入餐厅后,看桌子上是否有食物,如果有则开吃,吃完后唤醒厨师继续做;如果桌子上没有食物就进行等待。厨师首先判断桌子上是否有食物,如果有则等待顾客吃,没有食物就会制作食物并把食物放到桌子上并叫醒正在等待的顾客吃饭。

 其中涉及的代码方法:

二、等待唤醒机制(生产者消费者模式)代码实现:

1、生产者代码:

package com.songqiao.threadwaitanddnotify;

public class Cooker extends Thread {
    @Override
    public void run() {
        while (true){
            synchronized (Desk.lock){
                //判断还能做几份
                if(Desk.count==0){
                    break;
                }else {
                    //判断桌子上是否有食物
                    if (Desk.foodFlag==1){
                        try {
                            //有 等待
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //没有 制作食物
                    System.out.println("厨师开火,厨师还能做:"+Desk.count+"碗面条!");
                    //把食物放桌子上
                    Desk.foodFlag=1;
                    //叫醒等待的顾客开吃
                    Desk.lock.notifyAll();
                }
            }




        }
    }
}

2.桌子代码(控制生产者和消费者):

package com.songqiao.threadwaitanddnotify;

public class Desk {
    /**
     * 控制生产者和消费者的执行
     */

    //表示桌子上是否有面条,0:没有 1:有
    public static int foodFlag=0;

    //总个数,表示最多吃10份
    public static int count=10;

    //锁对象
    public static Object lock=new Object();
}

3.消费者代码:

package com.songqiao.threadwaitanddnotify;

public class Consumers extends Thread{
    @Override
    public void run() {
        /**
         * 1.循环
         * 2.同步代码块
         * 3.判断共享数据是否到末尾(先写到了末尾)
         * 4.没有到末尾的情况(执行核心逻辑)
         */
        while (true){
            synchronized (Desk.lock){
                if(Desk.count==0){
                    break;
                }else {
                 //先去判断桌子上是否有面条
                    if(Desk.foodFlag==0){
                        //没有 等待
                        try {
                            //让当前线程跟锁进行绑定
                            Desk.lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }else {
                        //把吃的总数-1
                        Desk.count--;
                        //有 开吃
                        System.out.println("顾客开始吃饭,还能吃:"+Desk.count+"碗面条!");
                        //吃完 唤醒厨师继续做
                        Desk.lock.notifyAll();
                        //修改桌子状态
                        Desk.foodFlag=0;
                    }
                }
            }
        }
    }
}

4.测试结果代码:

package com.songqiao.threadwaitanddnotify;

public class ThreadDemo {
    public static void main(String[] args) {
        /**
         * 生产者与消费者代码-实现线程轮流交替执行
         */
        Consumers consumers=new Consumers();
        Cooker cooker=new Cooker();

        consumers.start();
        cooker.start();
    }
}

5.结果截图:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/797348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Simulink仿真模块 - Bus Selector

us Selector:从传入总线中选择元素 在仿真库中的位置为:Simulink / Commonly Used Blocks Simulink / Signal Routing HDL Coder / Signal Routing 模型为: 说明 Bus Selector 模块输出您从输入总线选择的元素。该模块可以单独输出所选的各元素或在一个新的虚拟总线中输出所…

浅谈智能电容器在低压配电网末端的应用

安科瑞 华楠 摘要:电容器优化配置和投切是配电网络优化的一项重要内容。电容器优化配置,侧重对电容器优化投切的各种算法进行了详细评述,分析了各种算法的特点及存在的问题,以促进该研究领域的进一步发展。 关键词:电…

uniapp 微信小程序 页面+组件的生命周期顺序

uniapp 微信小程序 页面组件的生命周期顺序 首页页面父组件子组件完整顺序参考资料 首页 首页只提供了一个跳转按钮。 <template><view><navigator url"/pages/myPage/myPage?namejerry" hover-class"navigator-hover"><button ty…

15、PHP神奇的数组索引替代

1、有数字索引指定的数组元素时&#xff0c;以数字索引的为准。 <?php $aarray(a,b,1>c,5>"d","e"); print_r($a); ?> 输出结果&#xff1a;b的位置直接被c替代了&#xff0c;e 的值为最大的整数索引1。 PHP不这么搞&#xff0c;怎么可能成…

微信怎么弄定时提醒时间?微信怎样设置日程提醒?

微信在社交应用中的地位举足轻重&#xff0c;几乎上每个使用智能手机的人都拥有一个微信号&#xff0c;方便和朋友、家人、同事进行信息的交流。对于不少网友来说&#xff0c;手机上每天接收的各类消息很多&#xff0c;但是唯独不能错过微信消息提醒&#xff0c;所以就想要让微…

【算法训练营】字符串转成整数

字符串转成整数 题目题解代码 题目 点击跳转: 把字符串转换为整数 题解 【题目解析】&#xff1a; 本题本质是模拟实现实现C库函数atoi&#xff0c;不过参数给的string对象 【解题思路】&#xff1a; 解题思路非常简单&#xff0c;就是上次计算的结果10&#xff0c;相当于10…

观察者模式与观察者模式实例EventBus

什么是观察者模式 顾名思义&#xff0c;观察者模式就是在多个对象之间&#xff0c;定义一个一对多的依赖&#xff0c;当一个对象状态改变时&#xff0c;所有依赖这个对象的对象都会自动收到通知。 观察者模式也称为发布订阅模式(Publish-Subscribe Design Pattern)&#xff0…

Java版工程管理系统-简洁+好用+全面-工程项目管理

工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff1a;实现对数据字典标签的增删改查操作 2、编码管理&#xff1a;实现对系统编码的增删改查操作 3、用户管理&#xff1a;管理和查看用户角色 4、菜单管理&#xff1a;实现对系统菜单的增删改查操…

vue项目登录页面实现记住用户名和密码

vue项目登录页面实现记住用户名和密码 记录一下实现的逻辑&#xff0c;应该分两步来理解这个逻辑 首次登录&#xff0c;页面没有用户的登录信息&#xff0c;实现逻辑如下&#xff1a; 用户输入用户名和密码登录&#xff0c;用户信息为名为form的响应式对象&#xff0c;v-model…

服务器 Docker Alist挂载到本地磁盘(Mac版)夸克网盘

1.服务器下载alist 默认有docker环境 docker pull xhofe/alist2.生成容器 -v /home/alist:/opt/alist/data 这段意思是alist中的数据映射到docker 主机的文件夹&#xff0c;/home/alist就是我主机的文件夹&#xff0c;这个文件夹必须先创建 docker run -d --restartalways…

【实战】记录一次edusrc挖掘

1.我的挖掘逻辑 因为实际渗透会遇到一个登入框摆在面前的情况比较多&#xff0c;所以我选择的目标多数也是某某系统登入界面。 我的测试逻辑一般是 1.弱口令爆破密码泄露查找 2.xss(比较少而且不是存储基本不收意思意思就好)sql注入(稍微测下&#xff0c;比较少) 3.从js或…

Python数据可视化工具——Pandas绘图

Pandas常见图表&#xff1a;线形图、柱状图、散点图、直方图、箱型图、饼图 pandas底层是matplotlib 1 序列绘图 官方文档&#xff1a;https://pandas.pydata.org/docs/reference/api/pandas.Series.plot.html 一般快速绘图时&#xff0c;只需要修改kind里面就可以 准备数据…

全局ip代理安全吗? 手机设置全局代理方法详解

全局IP代理并不一定是安全的&#xff0c;因为全局IP代理会将所有网络流量都通过代理服务器进行转发&#xff0c;包括敏感信息和隐私数据。如果代理服务器受到黑客攻击或存在安全漏洞&#xff0c;可能会导致数据泄露和其他安全问题。因此&#xff0c;在使用全局IP代理时&#xf…

spring资源操作

spring资源操作(Resource) Java的标准java.net.URL类和各种URL前缀的处理标准处理程序无法满足所有对low-level资源的访问&#xff0c;比如&#xff1a;没有标准优化的URL实现可用于访问需要从类路径或相对于ServletContext获取的资源。并缺少某些Spring所需要的功能。如检测某…

java发送短信验证码《工具类》

1、短信的签名 就是申请短信服务的平台是做什么的&#xff1f; 2、短信的模板 尊敬的${name}&#xff0c;感谢您的注册&#xff0c;您的MT4账号&#xff1a;${account}&#xff0c;密码&#xff1a;${password},请到官网下载软件。3、发送信息 pom.xml <!-- 阿里…

软件模块管理权限的设置

在应用软件中&#xff0c;通常将软件的功能分为若干个子程序&#xff0c;通过主程序调用。那么&#xff0c;通过众多客户来 说明&#xff0c;如果设置各人的权限呢? 一、模板的权限 .主程序Main.EXE&#xff0c;通过菜单调用几十个子程序。如&#xff1a; 1、主程序Main.EXE&a…

Redis学习1--Redis简介与基础数据类型操作

1、什么是Redis? Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库 特点&#xff1a; 键值&#xff08;key-value&#xff09;型&#xff0c;value支持多种不同数据结构&#xff0c;功能丰富单线程&#xff0c;每个命令具…

Winform使用PictureBox控件显示图片并且自适应

一.首先我们只需要在项目文件中的/bin/Debug 下面创建一个文件夹保存你的照片。我这里文件夹名字叫Resources.。如图&#xff1a; 二. 然后我们把我们的照片放入Resources文件夹中即可。如图&#xff1a; 三.在构造器中添加picturebox控件。如图&#xff1a; 四.我们到初始化代…

Mybatis学习笔记教程

Mybatis-9.28 环境&#xff1a; JDK1.8Mysql 5.7maven 3.6.1IDEA 回顾&#xff1a; JDBCMysqlJava基础MavenJunit SSM框架&#xff1a;配置文件的。 最好的方式&#xff1a;看官网文档&#xff1b; 1、简介 1.1、什么是Mybatis MyBatis 是一款优秀的持久层框架它支持定制…

智能驾驶中的数据标注

目前&#xff0c;各大自动驾驶汽车制造商都在通过获取高质量的训练数据最大化其数据资产的投入产出比。在海量的智能驾驶数据面前&#xff0c;如何让每个数据都有存在意义&#xff1f;从《数字商业时代》对澳鹏Appen(中国)高级产品总监张童皓的采访中&#xff0c;你或许能找到一…