1.模型概念

        生产消费模型是一种通过“生产者”生成数据/资源,“消费者”处理数据/资源,并借助“缓冲区”协调两者速度差异的设计模式。它的核心要素如下:

-生产者:负责产生数据。

-消费者:负责处理数据。

-缓冲区:暂存生产者生成的数据,避免生产者因消费者处理慢而等待,或消费者因生产者生成慢而空闲。

-同步机制:保证缓冲区操作的线程安全,避免“生产者多存、消费者多取”或“缓冲区空/满时操作”的问题。

2.核心流程

1. 生产者启动与数据生成
生产者线程开始运行,生成数据准备存入缓冲区。

2. 同步检查与数据存入
生产者通过同步机制检查缓冲区:

- 若缓冲区未满,直接将数据存入缓冲区;

- 若缓冲区已满,生产者进入阻塞状态,等待缓冲区有空位后被唤醒。

3. 缓冲区暂存与状态通知
数据存入缓冲区后,同步机制会通知等待的消费者(如调用notify()、释放信号量),告知“缓冲区有新数据可处理”。

public class Producer implements Runnable {
    //保存数据的仓库
    public List<Product> list;
    //设置仓库上限

    public int max = 5;

    public Producer(List<Product> list) {
        this.list = list;
    }


    public void run() {
        while (true) {
            synchronized (list) {
                //检查仓库容量
                while (list.size() >= max) {//仓库已满
                    //生产者线程进入等待状态
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                //生产数据,唤醒消费者
                Product product = new Product();
                list.add(product);
                System.out.println("生产");
                list.notify();
                try {
                    list.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }

        }
    }
}

        此处同步机制采用基础锁机制,用 synchronized 锁保护缓冲区,搭配 wait() / notify() 控制生产和消费的时机,是最经典的实现方式。

4. 消费者同步检查与数据取出
消费者线程通过同步机制检查缓冲区:

- 若缓冲区非空,从缓冲区取出数据;

- 若缓冲区为空,消费者进入阻塞状态,等待缓冲区有数据后被唤醒。

5. 数据处理与循环
消费者处理取出的数据,处理完成后回到步骤4,继续等待下一批数据;同时,生产者回到步骤2,继续生成新数据,形成循环。

public class Consumer implements Runnable {
    public List<Product> list;


    public Consumer(List<Product> list) {
        this.list = list;
    }

    public void run() {

        while (true) {
            synchronized (list) {
                while (list.isEmpty()) {
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                list.remove(list.size() - 1);
                System.out.println("消费");
                list.notify();
                try {
                    list.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

            }
        }
    }
}

3.应用场景      

        生产消费模型的核心应用场景在于解决数据生成与处理在速度、频率或并发上的不匹配问题,主要可分为以下四类:

1.异步任务处理

适用于需要提交任务后立即返回、无需等待结果的场景,避免主线程阻塞。

应用:用户注册时,主线程快速返回"注册中"提示,后台异步处理发送验证邮件、数据入库等操作。

2.流量削峰填谷

应对突发流量场景,通过缓冲区平抑峰值压力。

应用:电商秒杀活动时,将瞬时订单请求暂存消息队列,后台系统按处理能力逐步消化,保障系统稳定性。

3.模块解耦

降低系统模块间的直接依赖,支持独立演进。

应用:游戏开发中,敌人生成模块与AI处理、渲染模块通过共享队列交互,各模块可独立升级优化。

4.批量处理优化

适用于高频产生但处理成本高的场景,通过批量操作提升效率。

应用:日志系统累计100条日志后批量写入数据库,显著减少I/O操作次数。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐