设计模式之多线程分工模式--- 生产-消费者模式

系列文章目录

设计模式之避免共享的设计模式Immutability(不变性)模式
设计模式之并发特定场景下的设计模式 Two-phase Termination(两阶段终止)模式
设计模式之避免共享的设计模式Copy-on-Write模式
设计模式之避免共享的设计模式 Thread-Specific Storage 模式
设计模式之多线程版本的if------Guarded Suspension模式
设计模式之多线程版本的if------Balking模式
设计模式之多线程分工模式— Thread-Per-Message模式
设计模式之多线程分工模式—Worker Thread模式


文章目录

  • 系列文章目录
  • 前言
  • 应用场景
    • 场景
    • 样例
  • 优缺点
    • 优点
    • 缺点


前言

  • Worker Thread模式类比的是工厂里车间工人的工作模式。但其实在现实世界,工厂里还有一种流水线的工作模式,类比到编程领域,就是生产者 - 消费者模式。
  • 生产者 - 消费者模式的核心是一个任务队列,生产者线程生产任务,并将任务添加到任务队列中,而消费者线程从任务队列中获取任务并执行。
  • 消息队列(MQ)可以被看作是一种生产者-消费者模式的实现。MQ充当了一个中间件的角色,用于解耦消息的生产者和消费者,使它们能够异步地进行通信。

应用场景

场景

  1. 消息队列:生产者-消费者模式常用于消息队列的实现中。生产者负责向队列中添加消息,而消费者则负责从队列中取出消息进行处理。

  2. 数据库连接池:生产者-消费者模式可以用于管理数据库连接池。生产者负责创建新的数据库连接,将其添加到连接池中,而消费者则从连接池中获取连接并执行数据库操作。

  3. 线程池:线程池的任务队列就是一个典型的生产者-消费者场景。生产者向任务队列中添加任务,而消费者则从队列中获取任务并执行。

  4. 缓存系统:生产者-消费者模式可以用于缓存系统,生产者负责向缓存中添加数据,而消费者则从缓存中获取数据。

  5. 计算任务分发:在分布式系统中,生产者-消费者模式可以用于将计算任务分发到各个工作节点,生产者负责创建任务并将其添加到任务队列中,而消费者则从队列中获取任务并执行。

样例

import java.util.concurrent.*;/*** @author yang* @version 1.0.0* @date 2024/1/16 18:18*/
public class ProducerConsumerExample {public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(2);BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);Producer producer = new Producer(queue);Consumer consumer = new Consumer(queue);executor.submit(producer);executor.submit(consumer);executor.shutdown();}
}
class Producer implements Runnable {private BlockingQueue<Integer> queue;public Producer(BlockingQueue<Integer> queue) {this.queue = queue;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {try {System.out.println("生产>>>>>数据" + i);queue.put(i);Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
class Consumer implements Runnable {private BlockingQueue<Integer> queue;public Consumer(BlockingQueue<Integer> queue) {this.queue = queue;}@Overridepublic void run() {while (true) {try {int value = queue.take();System.out.println("数据>>>>消费" + value);Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}
}

优缺点

优点

  1. 解耦性:生产者和消费者之间通过中间的缓冲区(队列)进行通信,从而实现了解耦,生产者和消费者可以独立进行处理,提高了系统的灵活性和可维护性。

  2. 并发控制:生产者-消费者模式可以有效地控制多个线程之间的并发访问,通过合理地控制缓冲区的大小和生产者、消费者的速度,可以避免生产者和消费者之间的竞争和阻塞。

  3. 提高系统吞吐量:通过并行处理和异步通信,生产者-消费者模式可以提高系统的吞吐量和性能。

  4. 消除生产者与消费者之间速度差异:即削峰填谷

缺点

  1. 复杂性:实现生产者-消费者模式需要考虑到并发访问、同步和互斥控制等问题,增加了系统的复杂性。

  2. 容易出现问题:由于生产者和消费者之间的异步通信,可能导致一些问题的出现,比如数据一致性问题、死锁、过饱等,并发编程中的典型问题会增加对开发者的要求。

  3. 性能问题:如果生产者生产的速度远大于消费者的处理速度,可能导致队列满,从而影响系统的响应速度,需要设计合理的流量控制和调整。

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

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

相关文章

Linux定时删除n天前的数据

Linux定时删除n天前的数据 1.创建删除脚本并授权 touch /home/data/script/shell/auto-del-60-days-ago-log.sh chmod x auto-del-60-days-ago-log.sh 2.编写shell脚本&#xff08;auto-del-60-days-ago-log.sh&#xff09; vi auto-del-60-days-ago-log.sh 添加如下内容&a…

Golang 替换数字卡码54题

文章目录 替换数字 54卡码网直接操作读取的[]byte 替换数字 54卡码网 本题为卡码网的54题&#xff0c;起为acm模式的答题 这里我们不在输入获得的[]byte类型上直接修改&#xff0c;而是保存在新建的[]byte上 golang小知识&#xff1a; 单引号’&#xff0c;表示byte类型或rune…

进程的创建与回收学习笔记

目录 一、进程内容&#xff1a; 二、进程常用命令 三、创建子进程 四、子进程进阶 五、进程的退出 六、进程的回收 一、进程内容&#xff1a; 程序&#xff1a; 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程&#xff1a; 执行一个程序所…

Image Sensor常见分辨率下HTS,VTS设置

本文介绍Image Sensor常见分辨率下HTS&#xff0c;VTS设置。 Image Sensor的HTS&#xff0c;VTS设置非常重要&#xff0c;其与Pixel Clock和FPS有一定的相关性&#xff0c;本文列出常见的分辨率下HTS&#xff0c;VTS的设置。 常见的分辨率下HTS&#xff0c;VTS的设置如下表。…

拍照后的相机logo怎么去掉?看完你就知道了

在日常生活中&#xff0c;拍照已经成为了我们捕捉美好瞬间的习惯。山川湖海、花鸟鱼虫&#xff0c;城市风光、街角趣闻&#xff0c;我们都喜欢用相机或手机留住这些美好的回忆。然而&#xff0c;有时候&#xff0c;当我们按下的那一刹那&#xff0c;一些不速之客——logo&#…

SQL语句详解五-DCL(数据控制语言)

文章目录 DCL管理用户示例代码 权限管理示例代码用户权限 DCL 概述&#xff1a;DCL&#xff0c;数据库控制语言&#xff0c;用来管理用户和给用户授予权限的 管理用户 添加用户 CREATE USER 用户名主机名 IDENTIFIED BY 密码;删除用户 DROP USER 用户名主机名;修改用户密码 S…

安全狗连续3年获得中国网络空间安全协会感谢

在2024年的新年伊始&#xff0c;安全狗依托在2023年期间协助中国网络空间安全协会完成《网络安全态势感知研判分析报告》并支持相关网络安全态势研判工作而获得感谢信。 厦门服云信息科技有限公司&#xff08;品牌名&#xff1a;安全狗&#xff09;创办于2013年&#xff0c;是…

3d模型为什么打光只显示黑色---模大狮模型网

3D建模是现代制作动画、电影、游戏等数字媒体内容的重要工具。在建模过程中&#xff0c;打光是一个重要的环节&#xff0c;它可以让3D模型更加真实、有趣和生动。然而&#xff0c;如果打光不当&#xff0c;3D模型可能会呈现出黑色的效果&#xff0c;这可能会让人感到困惑和沮丧…

mybatisplus多租户执行复杂sql(如带case when之类的语句)报错问题

mybatisplus在多租户情况下&#xff0c;执行复杂sql时&#xff0c;会报&#xff1a;Failed to process,Error SQL:select ...&#xff0c;之前版本是加SqlParser注解关闭租户验证&#xff0c;新版本替换为&#xff1a;InterceptorIgnore(tenantLine "1")

vue批量下载图片打包为压缩包

yarn add jszip yarn add file-saver<template><div class"home"><button click"attachDownload">批量下载</button><div class"home_wrap"><div class"home_wrap_item" v-for"item in imageLi…

模拟瑞幸小程序购物车

是根据渡一袁老师的大师课写的&#xff0c;如有什么地方存在问题&#xff0c;还请大家指出来哟ど⁰̷̴͈꒨⁰̷̴͈う♡&#xff5e; index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-e…

浅谈智慧路灯安全智能供电方案设计

摘要: 智慧路灯&#xff0c;作为智慧城市、新基建、城市更新的主要组成部分&#xff0c;近些年在各大城市已得到很好的落地和 应用&#xff0c;但其与传统路灯相比集成大量异元异构电子设备&#xff0c;这些设备的供电电压、接口形式、权属单位各不相同&#xff0c; 如何设计一…

josef约瑟 漏电继电器 LLJ-400F Φ100 分体式结构,导轨安装

LLJ-400F AC660V漏电继电器是一种检测线路触&#xff08;漏&#xff09;电&#xff0c;并发出一个机械开闭信号至控制电路装置。它可与各种规格的低压断路器或交流接触器组成组合式剩余电流动作保护器。在如今已实现了较为完善的农村低压电网分级&#xff08;二级或三级&#x…

软件版本号的划分方式

软件版本号的划分方式可以因不同的开发流程、规范和团队而有所不同。通常&#xff0c;软件版本号由多个部分组成&#xff0c;如"主版本号.次版本号.修订号"&#xff0c;有时还可能包含预发布版本号&#xff08;如alpha、beta或rc&#xff09;。 以下是一种常见的版本…

Apache Solr <= 8.8.1任意文件读取漏洞复现CVE-2019-17558

一、环境准备 搭建环境vulhub&#xff0c;需要提前安装docker环境 docker安装&#xff1a;docker--安装docker-ce-CSDN博客 vulhub地址&#xff1a;https://github.com/vulhub/vulhub #创建靶场环境 mkdir /opt/vulhub cd /opt/vulhub git https://github.com/vulhub/vulhu…

elementPlus下拉框实现自定义模糊查询且100%匹配的优先展示

效果&#xff1a; 我们可以看到&#xff0c;本来创建时间在创建人之上&#xff0c;但经过我们搜索创建并进行匹配度排序后&#xff0c;创建人的匹配度更高&#xff0c;因此搜索之后&#xff0c;创建人就会显示在创建时间之上。 当然如果100%匹配的同样会优先展示在最上面。 第…

11.1 pcl_ros的点云学习

本文是看了两个博主的内容&#xff0c;整理在这里是为了以后用时方便查找&#xff0c;更容易理解。引用的博文路径如下&#xff1a; ROS入门——PCL激光雷达点云处理&#xff08;1&#xff09;_pcl::torosmsg-CSDN博客 以下功能的实现是我在ubuntu20.04的环境下&#xff0c;搭…

如何制作一本电子版时尚杂志

​随着数字媒体的崛起&#xff0c;电子版时尚杂志已成为一种新的时尚风向标。然而&#xff0c;如何制作一本独具特色的电子版时尚杂志&#xff0c;却让许多初涉此领域的品牌和设计师感到困惑。教你一些方法&#xff0c;制作一本电子版时尚杂志。 一、明确目标与定位 首先&…

C语言调试大作战:与VS编译器共舞,上演一场“捉虫记”的艺术与科学

少年们好&#xff0c;我是博主那一脸阳光&#xff0c;我们接下来介绍C语言的调试和bug的分享。 引言&#xff1a; “如果你曾经在深夜与一串神秘莫测的C代码狭路相逢&#xff0c;彼此瞪大眼睛&#xff0c;犹如牛仔对决般紧张刺激&#xff1b;或者你曾试图驯服一段狂野不羁的循环…

【小黑嵌入式系统第十五课】μC/OS-III程序设计基础(四)——消息队列(工作方式数据通信生产者消费者模型)、动态内存管理、定时器管理

上一课&#xff1a; 【小黑嵌入式系统第十四课】μC/OS-III程序设计基础&#xff08;三&#xff09;——信号量&#xff08;任务同步&资源同步&#xff09;、事件标记组&#xff08;与&或&多个任务&#xff09; 前些天发现了一个巨牛的人工智能学习网站&#xff0c…