Java 多线程实战:2 生产者 3 消费者模拟生产消费模式及关键逻辑解析
以下是使用 Java 实现多线程模拟生产消费模式的代码: ```java import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class ProducerConsumerExample { // 存储商品的阻塞队列 static BlockingQueue<Integer> goods = new LinkedBlockingQueue<>(); // 生产者线程 static class Producer implements Runnable { @Override public void run() { int produced = 0; while (produced < 10) { // 每个生产者最多生产 10 个商品 try { goods.put(1); // 生产一个商品 System.out.println("生产者生产了一个商品,当前商品数量: " + goods.size()); Thread.sleep(1000); // 模拟生产时间 } catch (InterruptedException e) { e.printStackTrace(); } produced++; } } } // 消费者线程 static class Consumer implements Runnable { @Override public void run() { while (true) { if (goods.isEmpty()) { // 如果商品数量为 0 ,暂停购买 try { Thread.sleep(1000); // 等待一段时间再检查 } catch (InterruptedException e) { e.printStackTrace(); } continue; } try { goods.take(); // 购买一个商品 System.out.println("消费者购买了一个商品,当前商品数量: " + goods.size()); Thread.sleep(2000); // 模拟购买时间 } catch (InterruptedException e) { e.printStackTrace(); } } } } public static void main(String[] args) { // 创建两个生产者线程 Thread producer1 = new Thread(new Producer()); Thread producer2 = new Thread(new Producer()); // 创建三个消费者线程 Thread consumer1 = new Thread(new Consumer()); Thread consumer2 = new Thread(new Consumer()); Thread consumer3 = new Thread(new Consumer()); // 启动线程 producer1.start(); producer2.start(); consumer1.start(); consumer2.start(); consumer3.start(); } } ``` 需要注意的逻辑点: 1. 线程的同步和互斥处理,确保对商品队列的操作是线程安全的。 2. 异常处理要完善,比如线程的中断异常、阻塞操作的异常等。 3. 考虑商品生产和消费的速度平衡,避免出现生产者生产过快导致内存溢出,或者消费者消费过快导致空等待。 ######[AI写代码神器 | 594点数解答 | 2024-11-27 08:33:56]
- Java 实现复制粘贴功能:打造简易文本复制粘贴程序(GPT | 1497点数解答 | 2024-08-25 09:40:33)438
- 解决数据库“dm.jdbc.driver.dmexception: 数据溢出”问题的全步骤指南(阿里通义 | 598点数解答 | 2024-10-15 15:48:38)337
- 达梦数据库数据溢出问题排查及多维度解决方法(阿里通义 | 403点数解答 | 2024-10-15 15:48:41)1232
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)312
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)331
- 易语言实现高并发 HTTP 操作:多线程、线程池与异步操作实战(字节豆包 | 849点数解答 | 2025-06-03 23:17:33)294
- 易语言多线程启动:如何传递并处理文本数组及注意要点(字节豆包 | 610点数解答 | 2025-08-04 18:05:23)205
- "Java Code: Uncovering Stock Statistics through CSV File Reading"(字节豆包 | 66点数解答 | 2024-11-13 15:31:04)347
- 洛谷乒乓球题解:11 分制与 21 分制比赛结果计算全攻略(DeepSeek | 675点数解答 | 2025-04-28 18:19:45)323
- C++ 模拟:助冒险者用神秘数字构建直角三角形,开发要点大揭秘! (DeepSeek | 156点数解答 | 2025-09-14 21:30:10)321
- P1007:小核桃数组变换难题,Python代码揭秘最终平方和!(字节豆包 | 416点数解答 | 2026-02-07 18:24:18)69
- P1007小核桃数组变换难题:C++代码求解最终两数平方和! (字节豆包 | 651点数解答 | 2026-02-07 18:25:02)69