用 Java 手写生产消费模型一、模型整体框架4 个核心部分​这套代码实现的生产消费模型主要包含 4 个关键组成​1、共享仓库用ArrayList存储数据是生产者与消费者的交互桥梁​2、生产者类producer实现Runnable接口负责生成随机数据并存入仓库​3、消费者类consumer同样实现Runnable接口负责从仓库取出数据并 “消费”​4、主类main初始化组件、建立关联并启动线程是模型的 “启动器”。​二、逐段解析代码从仓库到线程启动​1、共享仓库数据交互的 “中转站”​仓库的初始化在主类中完成代码如下ListInteger sharedList new ArrayList();作用作为生产者和消费者共用的数据容器生产者往里面存数据消费者从里面取数据​注意点ArrayList本身不具备线程安全性若多个线程同时操作可能出现数据错乱因此后续必须通过同步锁控制访问。2. 生产者类数据的 “生成者”​生产者的核心任务是 “造数据”关键代码与逻辑如下public class producer implements Runnable {​ // 关联共享仓库​ lists.add(data);​ // 打印生产状态便于观察流程​ System.out.println(生产者生产数据 data 当前仓库大小 lists.size());​ ​ // 唤醒所有等待的线程比如仓库空时等待的消费者​ lists.notifyAll();​ ​ // 模拟生产耗时模拟实际场景中数据生成的时间如读文件、调接口​ try {​ Thread.sleep(500); // 暂停500毫秒再进行下一次生产​ } catch (InterruptedException e) {​ e.printStackTrace();​ }​ }​ }​ }​ }核心逻辑先判断仓库是否满→未满则生产数据并入库→唤醒等待的消费者→模拟耗时后继续循环​关键机制synchronized (lists)确保线程安全wait()在仓库满时让生产者暂停notifyAll()在生产后唤醒消费者避免资源浪费。3. 消费者类数据的 “处理者”​消费者的任务是 “用数据”代码逻辑与生产者形成呼应public class consumer implements Runnable {​ // 关联共享仓库​ throw new RuntimeException(e);​ }​ }​ ​ // 仓库非空取出第一个数据移除并返回完成“消费”​ int data lists.remove(0);​ // 打印消费状态观察数据流转​ System.out.println(消费者消费数据 data 当前仓库大小 lists.size());​ ​ // 唤醒所有等待的线程比如仓库满时等待的生产者​ lists.notifyAll();​ ​ // 模拟消费耗时模拟实际场景中数据处理的时间如计算、存储​ try {​ Thread.sleep(300); // 暂停300毫秒再进行下一次消费​ } catch (InterruptedException e) {​ e.printStackTrace();​ }​ }​ }​ }​ }核心逻辑先判断仓库是否空→非空则取出数据并消费→唤醒等待的生产者→模拟耗时后继续循环​与生产者的协同通过wait()和notifyAll()实现 “供需平衡”—— 仓库空时消费者等仓库满时生产者等避免无效操作。4. 主类模型的 “启动与协调中心”​主类负责将各个组件串联起来启动整个模型代码如下public class main {​ public static void main(String[] args) {​ // 1. 初始化共享仓库​ ListInteger sharedList new ArrayList();​ ​ // 2. 创建生产者和消费者实例​ producer producer new producer();​ consumer consumer new consumer();​ ​ // 3. 建立关联让生产者和消费者操作同一个仓库​ producer.lists sharedList;​ consumer.lists sharedList;​ ​ // 4. 启动线程生产者和消费者开始工作​ new Thread(producer).start();​ new Thread(consumer).start();​ }​ }关键步骤先创建仓库再实例化生产者和消费者通过赋值lists让两者共享同一仓库最后启动线程​运行效果启动后控制台会持续打印生产与消费日志。