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

系列文章目录

设计模式之避免共享的设计模式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;
    }
    @Override
    public 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;
    }
    @Override
    public 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. 性能问题:如果生产者生产的速度远大于消费者的处理速度,可能导致队列满,从而影响系统的响应速度,需要设计合理的流量控制和调整。

相关推荐

  1. 设计模式线分工模式--- 生产-消费者模式

    2024-01-17 16:20:04       65 阅读
  2. 设计模式线分工模式---Worker Thread模式

    2024-01-17 16:20:04       65 阅读
  3. 设计模式线分工模式--- Thread-Per-Message模式

    2024-01-17 16:20:04       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-17 16:20:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-17 16:20:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-17 16:20:04       82 阅读
  4. Python语言-面向对象

    2024-01-17 16:20:04       91 阅读

热门阅读

  1. flink源码分析 - yaml解析

    2024-01-17 16:20:04       40 阅读
  2. PyTorch GPU利用率为0%(很低)

    2024-01-17 16:20:04       60 阅读
  3. c语言中指针作函数参数

    2024-01-17 16:20:04       63 阅读
  4. 免费chartGPT网站汇总

    2024-01-17 16:20:04       42 阅读
  5. 向量数据库如何解决大语言模型的“幻觉”问题

    2024-01-17 16:20:04       53 阅读
  6. FreeBSD上安装mysql数据库

    2024-01-17 16:20:04       48 阅读
  7. 【cuda】四、基础概念:Cache Tiled 缓存分块技术

    2024-01-17 16:20:04       52 阅读
  8. Day 37 贪心算法 6

    2024-01-17 16:20:04       57 阅读
  9. c#之枚举类型和结构体

    2024-01-17 16:20:04       46 阅读
  10. Redis面试题15

    2024-01-17 16:20:04       49 阅读
  11. 编程语言的发展未来?

    2024-01-17 16:20:04       57 阅读
  12. 【VTKExamples::PolyData】第二期 曲率

    2024-01-17 16:20:04       48 阅读