1.生产者-消费者模式是一种经典的多线程协作设计模式用于解决两方或多方协同处理数据的问题。2.核心角色1生产者负责生成数据/任务将其放入共享缓冲区。2消费者负责从缓冲区取出数据/任务进行消费处理。3缓冲区临时存储数据的容器通常用队列实现解耦生产者和消费者。3.实现思路1队列满时生产者wait()。while(queue.size() capacity) wait();2队列空时消费者wait()。while(queue.isEmpty()) wait();3操作完成后notifyAll()。queue.notifyAll();4.举例4.1 例11队列容量capacity 3。2生产者生产次数produceCount 5。3消费者消费次数consumeCount 5。输入3 // 队列容量为35 // 每个生产者生产5次5 // 每个消费者消费5次过程4.2 例2生产者速度过快4.3 例3消费者速度过快附代码class Solution { private final LinkedListInteger queue; private final int capacity; public Solution(int capacity) { this.queue new LinkedList(); this.capacity capacity; } // 生产者方法 // 使用的wait()方法会抛出InterruptedException异常 public void produce(int value) throws InterruptedException { synchronized (queue) { // while 队列满 - wait // 使用while防止虚假唤醒 while (queue.size() capacity) { System.out.println(Thread.currentThread().getName() 队列已满等待消费者消费...); // wait()方法会抛出InterruptedException异常 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.wait(); } // 生产 queue.add(value); System.out.println(Thread.currentThread().getName() 生产 value 当前队列: queue); // 唤醒所有等待线程即通知消费者线程 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.notifyAll(); } } // 消费者方法 // 使用的wait()方法会抛出InterruptedException异常 public int consume() throws InterruptedException { synchronized (queue) { // while 队列空 - wait // 使用while防止虚假唤醒 while (queue.isEmpty()) { System.out.println(Thread.currentThread().getName() 队列为空等待生产者生产...); // wait()方法会抛出InterruptedException异常 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.wait(); } // 消费 int value queue.remove(); System.out.println(Thread.currentThread().getName() 消费 value 当前队列: queue); // 唤醒所有等待线程即通知生产者线程 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.notifyAll(); return value; } } }ACM模式import java.util.LinkedList; import java.util.Queue; import java.util.Scanner; /** * 生产者消费者模式 - ACM模式 * 输入格式 * 第一行队列容量 capacity * 第二行生产者生产次数 produceCount * 第三行消费者消费次数 consumeCount */ public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); // 读取输入 int capacity scanner.nextInt(); int produceCount scanner.nextInt(); int consumeCount scanner.nextInt(); // 创建Solution实例 Solution solution new Solution(capacity); // 创建生产者和消费者线程 Thread producer new Thread(() - { for (int i 1; i produceCount; i) { try { solution.produce(i); Thread.sleep(100); // 模拟生产间隔 } catch (InterruptedException e) { // sleep()方法会抛出InterruptedException异常 Thread.currentThread().interrupt(); } } }, Producer); Thread consumer new Thread(() - { for (int i 1; i consumeCount; i) { try { solution.consume(); Thread.sleep(150); // 模拟消费间隔 } catch (InterruptedException e) { // sleep()方法会抛出InterruptedException异常 Thread.currentThread().interrupt(); } } }, Consumer); // 启动线程 producer.start(); consumer.start(); // 等待线程结束 try { producer.join(); consumer.join(); // join()方法也是阻塞方法也会抛出InterruptedException异常 } catch (InterruptedException e) { e.printStackTrace(); } scanner.close(); } } class Solution { private final LinkedListInteger queue; private final int capacity; public Solution(int capacity) { this.queue new LinkedList(); this.capacity capacity; } // 生产者方法 // 使用的wait()方法会抛出InterruptedException异常 public void produce(int value) throws InterruptedException { synchronized (queue) { // while 队列满 - wait // 使用while防止虚假唤醒 while (queue.size() capacity) { System.out.println(Thread.currentThread().getName() 队列已满等待消费者消费...); // wait()方法会抛出InterruptedException异常 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.wait(); } // 生产 queue.add(value); System.out.println(Thread.currentThread().getName() 生产 value 当前队列: queue); // 唤醒所有等待线程即通知消费者线程 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.notifyAll(); } } // 消费者方法 // 使用的wait()方法会抛出InterruptedException异常 public int consume() throws InterruptedException { synchronized (queue) { // while 队列空 - wait // 使用while防止虚假唤醒 while (queue.isEmpty()) { System.out.println(Thread.currentThread().getName() 队列为空等待生产者生产...); // wait()方法会抛出InterruptedException异常 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.wait(); } // 消费 int value queue.remove(); System.out.println(Thread.currentThread().getName() 消费 value 当前队列: queue); // 唤醒所有等待线程即通知生产者线程 // Java中任何对象都可以使用wait()/notify()实现线程间通信队列对象自然也可以 // 生产者和消费者共享同一个队列对象在同一个对象上进行 wait 和 notify queue.notifyAll(); return value; } } }